c – 乘法继承类的复制构造函数
考虑一下这段代码:
#include <vector> #include <iostream> using namespace std; class Base { char _type; public: Base(char type): _type(type) {} ~Base() { cout << "Base destructor: " << _type << endl; } }; class uncopyable { protected: uncopyable() {} ~uncopyable() {} private: uncopyable( const uncopyable& ); const uncopyable& operator=( const uncopyable& ); }; class Child : public Base,private uncopyable { int j; public: Child(): Base('c') {} ~Child() { cout << "Child destructor" << endl; } }; int main() { vector<Base> v; Base b('b'); Child c; v.push_back(b); v.push_back(c); return 0; } 我系统的输出是: Base destructor: b Child destructor Base destructor: c Base destructor: b Base destructor: b Base destructor: c 我的问题是: >为什么Base(具有类型b)的析构函数被调用三次而不是两次(我们是否有两个以上的对象b副本)? 代码以这种方式设计的原因是因为Child类很大. 每当客户端尝试复制Child对象(调用Child的析构函数而不调用Base的析构函数)时,所需的行为就是丢弃子数据. 这段代码实现了这一点,但我猜它会导致未定义的行为并且有内存泄漏(从不为复制的实例调用Child的析构函数). 解决方法
以下是您的代码中发生的情况:
int main() { vector<Base> v; // 1 Base b('b'); // 2 Child c; // 3 v.push_back(b); // 4 v.push_back(c); // 5 return 0; } // 6 >第1行:矢量v构造 没有内存泄漏 – 对于上面序列中的每个构造函数,都会调用相应的析构函数. 此外,您似乎对复制构造函数非常困惑.子c被传递给push_back作为Base& – 然后按预期调用Base的复制构造函数.由于Base的隐式复制构造函数不是虚拟的或覆盖的,因此让Child从uncopyable派生不会改变它. 注意,矢量< Base>不能存储Child类型的对象;它只知道为Base分配足够的内存.将Child实例分配给Base时发生的事情称为切片,虽然通常是无意识和误解,但在您描述的场景中看起来可能实际上是您想要的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |