多态性:代码中的编译错误。需要一个解释

时间:2013-02-27 19:08:35

标签: c++

以下代码给出了编译错误: “无法从第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;
}

3 个答案:

答案 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();
};