gpt4 book ai didi

c++ - 仅使用基类指针复制派生实体,(无需详尽的测试!) - C++

转载 作者:IT老高 更新时间:2023-10-28 12:36:11 26 4
gpt4 key购买 nike

给定一个由大量派生类继承的基类,以及一个要求您通过指向每个实体的基类指针来管理这些的程序结构。在只知道基类指针的情况下,有没有一种简单的方法可以复制整个派生对象?

环顾四周,使用 dynamic_cast 调用检查是否可以将基指针转换为适当的派生类,然后使用派生类的复制构造函数复制它似乎是可能的(如果非常乏味的话) .然而,这并不是一个真正的最佳解决方案,部分原因是过度使用了 dynamic_cast,而且维护和扩展也会让人头疼。

我遇到的另一个更优雅的解决方案如下:

class Base
{
public:
Base(const Base& other);
virtual Base* getCopy();
...
}

class Derived :public Base
{
Derived(const Derived& other);
virtual Base* getCopy();
...
}

Base* Base::getCopy()
{
return new Base(*this));
}

Base* Derived::getCopy()
{
return static_cast<Base*>(new Derived(*this));
}

然后通过在指向任何派生对象的基类指针上调用 getCopy() 仍然可以得到一个基类指针,但整个派生对象也已被复制。这种方法感觉更易于维护,因为它只需要在所有派生类中都有一个类似的 getCopy() 函数,并且无需针对所有可能的派生对象进行测试。

本质上,这是明智的吗?还是有更好、更简洁的方法?

最佳答案

这种方法是复制多态对象的首选方法,因为它免除了确定如何将任意类型的对象复制到该对象的责任,而不是试图在编译时确定它。更一般地说,如果您在编译时不知道基类指针指向什么,则您不可能知道需要执行许多潜在代码中的哪一个才能获得正确的拷贝。因此,任何可行的解决方案都需要动态选择代码,而虚函数是一种很好的方法。

对您的实际代码的两条评论。首先,C++ 继承允许派生类覆盖基类成员函数,以使派生函数返回比基类版本更具体的类型的指针。这称为协方差。例如,如果一个基类函数是

virtual Base* clone() const;

然后派生类可以覆盖它为

virtual Derived* clone() const;

这将完全正常。例如,这允许您拥有这样的代码:

Derived* d = // something...
Derived* copy = d->clone();

如果没有协变重载,这将是不合法的。

另一个细节 - 在您拥有的代码中,您明确地 static_cast 派生的指针指向代码中的基指针。这是完全合法的,但没有必要。 C++ 将在不进行强制转换的情况下将派生类指针隐式转换为基类指针。但是,如果您使用协变返回类型的想法,则不会出现这种情况,因为返回类型将与您将要创建的对象的类型相匹配。

关于c++ - 仅使用基类指针复制派生实体,(无需详尽的测试!) - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5027456/

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