次のC++での多態性の例を考えてみましょう。私にとって、これは予期せぬ動作であり、おそらくまだ私はJavaであまりにも多くのことを考えているということにあります。私にとっての質問は、今、より具体的なメソッドを呼び出すポインタの例を取得する方法です。ポインタを持つ多型:: boost :: shared_ptr
#include <iostream>
#include <string.h>
#include <boost/tr1/memory.hpp>
class Image {
public:
Image(std::string className = "Image")
: className_(className)
{}
virtual ~Image() {}
virtual std::string className() {
return className_;
}
private:
std::string className_;
};
class RightImage : public Image {
public:
RightImage()
: Image("RightImage")
{}
};
class Processor{
public:
void process(Image& image){
std::cout << "Invoking process(Image& image) with image of type \"" << image.className() << "\"" << std::endl;
}
void process(RightImage& rightImage){
std::cout << "Invoking process(RightImage& rightImage) with rightImage of type \"" << rightImage.className() << "\"" << std::endl;
}
void process(Image* image){
std::cout << "Invoking process(Image* image) with image of type \"" << image->className() << "\"" << std::endl;
}
void process(RightImage* rightImage){
std::cout << "Invoking process(RightImage* rightImage) with rightImage of type \"" << rightImage->className() << "\"" << std::endl;
}
};
int main(int argc, char **argv) {
std::tr1::shared_ptr<Image> rightImageSharedPtr(new RightImage());
Image* rightImagePointer = new RightImage();
RightImage rightImage;
Processor processor;
std::cout << "value: ";
processor.process(rightImage);
std::cout << "shared_ptr: ";
processor.process(*rightImageSharedPtr);
std::cout << "old fashioned pointer 1: ";
processor.process(*rightImagePointer);
std::cout << "old fashioned pointer 2: ";
processor.process(rightImagePointer);
}
そのプログラムの出力は次のとおり起動プロセス(画像&画像)と:
値:タイプ "RightImage"
のshared_ptrのrightImageと起動プロセス(RightImage & rightImage)タイプ「RightImage」の画像
旧式のポインタ1:画像を呼び出す処理(画像&画像)タイプ「RightImage」
昔ながらのポインタ2:タイプのイメージと起動プロセス(画像*画像)「RightImage」
は、どのように私は最後の3例もprocess(RightImage&)
とprocess(RightImage*)
を呼び出すことができますか?あなたは
std::tr1::shared_ptr<RightImage> rightImageSharedPtr(new RightImage());
RightImage* rightImagePointer = new RightImage();
代替のちょうどより複雑な方法である各関数を呼び出す前にはdynamic_castを実行することであるとして、あなたの変数を宣言する必要があるので、
これはJavaで動作するはずですか? – curiousguy
@curiousguyいいえ、そうではありません。しかしJavaでは、リフレクションを使用してクラスタイプを取得することができました;-) – sebastiangeiger