C++ 继承和复制构造函数,用于非平凡类(深层复制)
C++ Inheritance and copy constructors, for non-trivial classes (deep copy)
应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 编写任何特殊函数(不是复制/移动构造函数的构造函数除外)。 因此,您的代码仍然很简单,并且没有办法出错,并且您不会像A
和B
示例中那样到处都有代码重复。
铌。 std::unique_ptr<int>
可能会扮演你需要你的int *
做的角色,如果是这样,那么用它来避免重新发明轮子。当指针具有所有权语义时,最好指示 . 原始指针应该只用于指向其他人拥有的东西(即使这样,也要尽量避免它)。
相关文章:
- 使用智能指针附加的继承对象的深层复制
- 在继承层次结构中复制和移动
- 使用继承的指针列表复制构造函数或重载运算符=
- 多复制构造函数继承中的惊人行为
- 将复制构造函数设置为默认值在继承自 QObject 时不起作用
- C++17 中复制构造函数的继承
- 在整个继承链中复制构造
- C++ 默认构造函数在移动和复制构造函数存在时不随"using"继承
- 复制构造函数无法识别继承的成员
- 使用 "using" 关键字继承基类的复制和移动构造函数
- 是否应在调用基本CTOR时复制继承的构造函数
- 如何调用所有基本类的复制构造函数,以在C 中复制钻石继承中最派生的类对象
- CRTP 和复制/移动赋值/构造函数继承
- 复制构造函数继承动态分配的数组
- 从C++中的基类继承复制/移动构造函数作为构造函数
- C++14 不能调用从唯一指针继承的类的复制构造函数或运算符 =
- 构造函数尝试调用复制构造函数,虚拟继承
- 在派生类构造函数中复制继承的成员有效吗
- 如何从基类指针复制继承的类而不进行拼接
- 我可以用重载复制继承吗?