[英]Why are C++ classes with virtual functions required to have a non-trivial copy constructor?
[英]C++ Inheritance and copy constructors, for non-trivial classes (deep copy)
应MM的要求,我已重新发布了此问题。
这个问题是关于继承的,而不是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
的copy-constructor初始化此B
对象的A
成员。
注意:更好的设计是使每个资源管理对象都是独立的。 例如,如果B
实际上有两个初始化为b{new int}, c{new int}
指针成员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
示例中那样到处都有代码重复。
NB。 std::unique_ptr<int>
可能会充当您需要int *
来完成的角色,如果是这样,则可以使用它来避免重新发明轮子。 当指针具有所有权语义时,最好指出这一点。 原始指针仅应用于指向别人拥有的东西(即使那样,也要尽量避免使用它)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.