gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:24:03 25 4
gpt4 key购买 nike

为什么 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]

最佳答案

C++ 是“不变的”而非“逆变的”,这意味着指向基类的指针可以包含派生类的对象,但反之则不然。

所以在你的代码中:

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

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

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

  • 我认为您没有正确理解多态性 是如何实现和工作的。

    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();

关于c++ - 从虚方法返回派生对象指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50032959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com