指针的多态性/boost::shared_ptr
Polymorphism with pointers/boost::shared_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);
}
程序的输出是:
value:调用进程(右timage &
shared_ptr:调用进程(Image&
老式指针1:调用进程(Image&
老式指针2:调用进程(Image* Image)的图像类型为" righttimage "
如何使最后三个例子也称为process(RightImage&)
和process(RightImage*)
?
除了tokage建议的双调度之外,您还可以只有一个Process()函数,其基类引用作为参数,然后通过调用Process()函数内部基类的虚函数来使用多态性。
我想你需要双重调度/访客模式来解决你的问题。
接口下的图像类型信息仅在对象内部可用。因此,您需要调用图像对象上的虚拟方法来获取您的底层类型。
的例子:
class Image{
virtual void process(Processor &processor)=0;
}
class RightImage{
virtual void process(Processor &processor){
processor.process(this);
}
}
当然,您也可以在process()-Method中在图像类内部进行处理,但我怀疑您希望不同类型的处理器处理不同类型的图像。另一种选择——可能更简洁一点——是让处理器为单个处理步骤调用虚拟方法,这些步骤因图像类型而异。
重载是在函数参数的静态类型上解决的,因此您需要将变量声明为
std::tr1::shared_ptr<RightImage> rightImageSharedPtr(new RightImage());
RightImage* rightImagePointer = new RightImage();
另一种方法是在调用每个函数之前执行dynamic_cast,这是一种更复杂的方法。
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理