为什么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]
答案 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();