C++ 继承和复制构造函数,用于非平凡类(深层复制)

C++ Inheritance and copy constructors, for non-trivial classes (deep copy)

本文关键字:复制 继承 构造函数 用于 C++      更新时间:2023-10-16

应M.M.的要求,我重新发布了这个问题。

这个问题是关于继承的,而不是YSC之前认为的3法则。

我有一个班级(实际上是两个)

class A
{
private: // [!] ?
    int *a;
public:
    A(const A& other) : a{new int[...]}
    {
        std::copy(...)
    }
}
class B : public A
{
private:
    int *b;
public:
    B(const B& other) : b{new int [...]}
    {
        std::copy(...)
    }
}

显然,这些都是不平凡的类。我们需要在复制构造函数中深度复制数据。

用法示例

int main()
{
    B binst;
    B binst2(binst); // [LABEL 1]
}

如何为 class B 编写复制构造函数,以便int *a的值在[LABEL 1]时正确复制?

其他人提到了类之间的隐式类型转换。但我还不知道这到底是什么意思。(隐式转换将如何完成。

我相信这是一个简单的问题,但我似乎找不到答案。

在此设计中,复制构造函数为:

B(const B& other) : A(other), b{new int [...]}

调用 A 的复制构造函数来初始化此B对象的A成员。

注意:更好的设计是让每个资源管理对象都是独立的。例如,如果B实际上有两个指针成员初始化为 b{new int}, c{new int}则您的代码无法从第二个new引发的异常中恢复。

例如:

struct IntManager
{
    int *i;
    // here put your copy-constructors etc. etc.
};
struct A
{
    IntManager a;
};
struct B : A
{
    IntManager b;
};

这称为零法则。您不必为 A 或 B 编写任何特殊函数(不是复制/移动构造函数的构造函数除外)。 因此,您的代码仍然很简单,并且没有办法出错,并且您不会像AB示例中那样到处都有代码重复。

铌。 std::unique_ptr<int>可能会扮演你需要你的int *做的角色,如果是这样,那么用它来避免重新发明轮子。当指针具有所有权语义时,最好指示 . 原始指针应该只用于指向其他人拥有的东西(即使这样,也要尽量避免它)。