【发布时间】:2012-05-26 12:50:04
【问题描述】:
考虑这段代码:
#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类型的对象时,我预计会出现编译时错误。我以为孩子的默认复制构造函数会尝试调用 Uncopyable 类的私有复制构造函数并导致编译错误。为什么不给出编译错误?
之所以这样设计代码是因为Child 类很大。
当客户端试图复制Child 对象时,期望的行为是丢弃子数据(调用Child 的析构函数而不调用Base 的析构函数)。
这段代码实现了这一点,但我猜它会导致未定义的行为并存在内存泄漏(从不为复制的实例调用 Child 的析构函数)。
【问题讨论】:
-
您想要
compile-time错误还是要丢弃Child 的数据?这些是相互矛盾的陈述,除非我遗漏了什么。
标签: c++ inheritance stl multiple-inheritance copy-constructor