以下代码给出了编译错误: “无法从第1行中的'Cloneable *'转换为'AClass *'”。 据我所知,它处理编译时和运行时多态的概念。但我没有具体的推理。亲切的帮助。
struct Cloneable
{
virtual Cloneable* clone()
{
cout << "Cloneable";
return new Cloneable;
}
virtual ~Cloneable() {}
};
struct AClass : public Cloneable
{
virtual AClass* clone()
{
cout << "AClass";
return new AClass;
}
};
int main()
{
Cloneable* s1 = new AClass;
AClass* s2 = s1->clone(); //Line 1
return 0;
}
答案 0 :(得分:1)
基本上,当您将新的AClass *存储在基类指针中时,调用clone的结果将是Cloneable *,需要将其转换为AClass *,这可能并不总是安全的。因此编译器需要dynamic_cast ()
答案 1 :(得分:1)
虽然可以让它与演员“一起工作”,但你正在做的事情非常危险。您忘记删除两个动态分配的对象。像这样“隐藏动态内存分配”也不是一个好主意,特别是你不会在任何地方删除它。使用std :: unique_ptr或std :: shared_ptr会更容易,或者只是在堆栈上分配对象。
编辑:我首先没有给出直接回答的道歉:
AClass* s2 = dynamic_cast<AClass*>(s1->clone());
答案 2 :(得分:1)
您正在clone()
指针上调用Cloneable
。此方法返回Cloneable*
,因此您需要:
Cloneable* s2 = s1->clone();
这将实例化AClass
。这是使用此克隆习惯用法的标准方法。如果您正确使用多态,那么如果您有Cloneable*
或AClass*
则无关紧要。因此,您通常也会从Cloneable*
返回AClass::clone()
。当然,最好还是返回一个智能指针。
struct AClass
{
virtual std::unique_ptr<Cloneable> clone();
};
struct AClass : public Cloneable
{
virtual std::unique_ptr<Cloneable> clone();
};