Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带指针的多态性/boost::shared\u ptr 考虑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); } #包括 #包括 #包括 阶级形象{ 公众: 图像(std::string className=“图像”) :className(className) {} 虚拟~Image(){} 虚拟标准::字符串类名称(){ 返回类名; } 私人: std::字符串类名称; }; 类别RightImage:公共形象{ 公众: RightImage() :图像(“RightImage”) {} }; 类处理器{ 公众: 作废处理(图像和图像){ 重载是在函数参数的静态类型上解决的,因此您需要将变量声明为 std::tr1::shared_ptr<RightImage> rightImageSharedPtr(new RightImage()); RightImage* rightImagePointer = new RightImage(); std::tr1::shared_ptr rightImageSharedPtr(新的RightImage()); RightImage*rightImagePointer=新建RightImage();_C++_Operator Overloading_Polymorphism - Fatal编程技术网

带指针的多态性/boost::shared\u ptr 考虑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); } #包括 #包括 #包括 阶级形象{ 公众: 图像(std::string className=“图像”) :className(className) {} 虚拟~Image(){} 虚拟标准::字符串类名称(){ 返回类名; } 私人: std::字符串类名称; }; 类别RightImage:公共形象{ 公众: RightImage() :图像(“RightImage”) {} }; 类处理器{ 公众: 作废处理(图像和图像){ 重载是在函数参数的静态类型上解决的,因此您需要将变量声明为 std::tr1::shared_ptr<RightImage> rightImageSharedPtr(new RightImage()); RightImage* rightImagePointer = new RightImage(); std::tr1::shared_ptr rightImageSharedPtr(新的RightImage()); RightImage*rightImagePointer=新建RightImage();

带指针的多态性/boost::shared\u ptr 考虑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); } #包括 #包括 #包括 阶级形象{ 公众: 图像(std::string className=“图像”) :className(className) {} 虚拟~Image(){} 虚拟标准::字符串类名称(){ 返回类名; } 私人: std::字符串类名称; }; 类别RightImage:公共形象{ 公众: RightImage() :图像(“RightImage”) {} }; 类处理器{ 公众: 作废处理(图像和图像){ 重载是在函数参数的静态类型上解决的,因此您需要将变量声明为 std::tr1::shared_ptr<RightImage> rightImageSharedPtr(new RightImage()); RightImage* rightImagePointer = new RightImage(); std::tr1::shared_ptr rightImageSharedPtr(新的RightImage()); RightImage*rightImagePointer=新建RightImage();,c++,operator-overloading,polymorphism,C++,Operator Overloading,Polymorphism,另一种方法是在调用每个函数之前执行动态转换,这只是做同样事情的一种更复杂的方法。我认为您需要类似双重分派/访问者模式的方法来解决您的问题 界面下图像的实际类型信息仅在对象内部可用。因此,您需要调用图像对象上的虚拟方法来获取底层类型 例如: class Image{ virtual void process(Processor &processor)=0; } class RightImage{ virtual void process(Processor &pr

另一种方法是在调用每个函数之前执行动态转换,这只是做同样事情的一种更复杂的方法。

我认为您需要类似双重分派/访问者模式的方法来解决您的问题

界面下图像的实际类型信息仅在对象内部可用。因此,您需要调用图像对象上的虚拟方法来获取底层类型

例如:

class Image{
    virtual void process(Processor &processor)=0;
}

class RightImage{
    virtual void process(Processor &processor){
        processor.process(this);
    }
}
当然,您也可以在process()方法中的image类内部进行处理,但我怀疑您希望不同类型的处理器处理不同类型的图像。
另一个选择——可能更干净一点——是让处理器为单个处理步骤调用虚拟方法,这些步骤因图像类型不同而不同。

在tokage建议的方法旁边,您也可以只有一个过程()使用基类引用作为参数的函数,然后通过调用进程()中基类的虚拟函数来使用多态性函数。

理想情况下,
Image
将是我的接口,我将传入它的子类型进行处理,因此这并不完全适用于我的设计。@sebastiangeiger:如果这是你的设计,你不应该为子类型设置单独的重载。所有操作都应该通过公共接口完成。我在这个示例可能要求使用访问者模式,但在我的具体问题中,我使用了一个虚拟的
进程()
函数在
Image
类中并使用多态性。好的,我自己应该有访问者模式的想法:-)这应该在Java中工作?@curiousguy不,不是。但是在Java中我可以使用反射来获得类类型;-)