这已经是我发送的关于这个子喷墨机的几篇文章了,如果这让你们有些困扰,我很抱歉。在玩了几天后,尝试了不同的选择(模式)后,我得出了以下结论,这使得我可以更好地制定我的问题。C++多态克隆:如何从基础指针获取派生指针?
我有一个向量Base *
,并有从基地派生的各种Derived<T>
类。不同的类参数T在前面声明为前向声明。我需要的是从这个vector<Base *>
中获取一对对象,并使用模板来应用function(Derived<T1> obj1, Derived<T2> obj2)
以进行某种双重调度。然而,当我从vector中取出一个元素时,我无法将pointer-to-base转换为Derived指针。因此,我不能使用function(Derived<T1> obj1, Derived<T2> obj2)
。
当然,这可以简单地使用dynamic_cast<Derived<T> *>(base_ptr)
来实现。但是,这并不是我想要的,因为要做到这一点,必须事先知道T,而这里并不是这种情况。我必须能够从矢量中选择任何元素,而不必知道它们的类型。
因此,我尝试了多态克隆。尽管它使用协变返回类型,但不幸的是,它不起作用。正如SO中的不同人员以及C++标准所解释的,原因是在编译时,编译器仍然不知道对象的完整类型。因此,虽然有人希望clone()应该返回Derived<T> *
,但它会返回Base *
。
下面几行代码表达了我的意思。 一般而言,多态克隆在下列情况下使用:
Base *b1 = new Derived;
Base *b2;
b2 = b1->clone();
这不是我想要的。我需要的是一个指针到派生:
Base *b1 = new Derived;
Derived *d1;
d1 = b1->clone(); // This is what I want, but it fails.
这里,编译器会抱怨说,Base *
类型的对象不能被分配到Derived *
类型的对象。因此,我不能在function(,)
中使用*d1
。
我也尝试了非虚拟接口(NVI)方法,但它没有奏效。
有没有人有一个想法如何解决上面的简单代码,特别是最后一行?提前谢谢了。
查看[访问者模式](https://en.wikipedia.org/wiki/Visitor_pattern)多次发送。 – TartanLlama