gpt4 book ai didi

c++ - 复制对象——保持多态性

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:11 25 4
gpt4 key购买 nike

以下代码尝试复制一个对象并保持原始类型。不幸的是,它不起作用(每个复制的对象都将成为 Super 而不是与其原始对象属于同一类)。

请注意,copySuper(const Super& givenSuper) 不应该知道关于 Super 的子类的任何信息。

这样的拷贝可行吗?还是我必须更改 copySuper 的定义?

#include <string>
#include <iostream>

class Super
{
public:
Super() {};
virtual ~Super() {};

virtual std::string toString() const
{
return "I'm Super!";
}
};

class Special : public Super
{
public:
Special() {};
virtual ~Special() {};

virtual std::string toString() const
{
return "I'm Special!";
}
};

Super* copySuper(const Super& givenSuper)
{
Super* superCopy( new Super(givenSuper) );
return superCopy;
}

int main()
{
Special special;
std::cout << special.toString() << std::endl;

std::cout << "---" << std::endl;

Super* specialCopy = copySuper(special);
std::cout << specialCopy->toString() << std::endl;

return 0;
}

//Desired Output:
// # I'm Special!
// # ---
// # I'm Special!
//
//Actual Output:
// # I'm Sepcial!
// # ---
// # I'm Super!

最佳答案

试试这个:

class Super
{
public:
Super();// regular ctor
Super(const Super& _rhs); // copy constructor
virtual Super* clone() const {return(new Super(*this));};
}; // eo class Super


class Special : public Super
{
public:
Special() : Super() {};
Special(const Special& _rhs) : Super(_rhs){};
virtual Special* clone() const {return(new Special(*this));};
}; // eo class Special

请注意,我们已经实现了一个 clone() 函数,Special(以及 Super 的任何其他派生)覆盖该函数以创建正确的拷贝。

例如:

Super* s = new Super();
Super* s2 = s->clone(); // copy of s
Special* a = new Special();
Special* b = a->clone(); // copy of a

编辑:正如其他评论员所指出的,*this,而不是this。这会教我快速打字。

EDIT2:另一个更正。

EDIT3:我真的不应该在工作中这么快发帖。为协变返回类型修改了 Special::clone() 的返回类型。

关于c++ - 复制对象——保持多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4122789/

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