【发布时间】:2011-10-26 19:31:28
【问题描述】:
考虑以下 C++ 中的多态性示例。对我来说,这是出乎意料的行为,这可能在于我仍然在 Java 中思考太多。我现在的问题是:如何获取指针示例来调用更具体的方法。
#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”类型的 rightImage 调用进程(RightImage& rightImage)
shared_ptr:使用“RightImage”类型的图像调用进程(图像和图像)
老式指针1:使用“RightImage”类型的图像调用进程(图像和图像)
老式指针 2:使用“RightImage”类型的图像调用进程(Image* 图像)
我怎样才能让最后三个示例也调用process(RightImage&) 和process(RightImage*)?
【问题讨论】:
-
这应该在 Java 中工作?
-
@curiousguy 不,不是。但在 Java 中,我可以使用反射来获取类类型 ;-)
标签: c++ operator-overloading polymorphism