从虚方法返回派生对象指针

时间:2018-04-26 00:05:34

标签: c++ c++11

为什么s1-> duplicate()不会在代码示例1 中返回Box *? 我会假设派生的副本被调用,因此返回Box *但似乎返回了Shape *。

代码示例1:

#include <iostream>

struct Shape
{
  virtual Shape* duplicate()
  {
      std::cout << "c" << std::endl;
      return new Shape;
  }
  virtual void print()
  {
    std::cout << "SHAPE" << std::endl;
  }
  virtual ~Shape() {}
};

struct Box : public Shape
{
  virtual Box* duplicate()
  {
      std::cout << "b" << std::endl;
      return new Box;
  }
  virtual void print()
  {
    std::cout << "BOX" << std::endl;
  }
};

int main(int argc, char** argv) 
{ 
  Shape* s1 = new Box;
  Box* b1 = s1->duplicate();  //ISSUE HERE
  b1->print();

  delete s1;
  delete b1;
  return 0; 
}

错误: 34:27:错误:无效从'Shape *'转换为'Box *'[-fpermissive]

2 个答案:

答案 0 :(得分:1)

您使用duplicate()致电Shape *,因此返回值为Shape *

改变这个:

Box* b1 = s1->duplicate();

为:

Shape *b1 = s1->duplicate();

当您运行程序时,您会发现b1确实是Box

答案 1 :(得分:1)

C ++是&#34;不变的&#34;不是&#34;逆变&#34;这意味着指向基类的指针可以保存派生类的对象,但不能相反。

所以在你的代码中:

Box* b1 = s1->duplicate();  //ISSUE HERE

上面你试图在b1类的shape对象中存储。哪个不正确。

您的克隆功能是正确的,但您滥用它。

  • 我认为你并没有正确理解Polymorphism是如何实现和运作的。

    Shape* s1 = new Box; // s1 is of Type Shape whatever the type of object it point to be.
    Box* b1 = (Box*)s1->duplicate();
    b1->print();