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

时间:2016-03-09 11:19:14

标签: c++ inheritance copy-constructor

根据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]的值?

其他人提到了类之间的隐式类型转换。但我还不知道这究竟意味着什么。 (如何进行隐式转换。)

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

1 个答案:

答案 0 :(得分:4)

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

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

您调用A的copy-constructor来初始化此A对象的B成员。

注意:更好的设计是让每个资源管理对象都是自包含的。例如,如果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示例中那样在任何地方进行代码重复。

NB。 std::unique_ptr<int>可能会为您int *提供所需的角色,如果是这样,那么请使用它来避免重新发明轮子。当指针具有所有权语义时,最好指出这一点。原始指针应该只用于指向其他人拥有的东西(即使这样,也要试着避免它)。