Sha*_*ain 4 c++ virtual-destructor
我正在尝试以下示例:
class base // base class
{
public:
std::list<base*> values;
base(){}
void initialize(base *b) {
values.push_front(b);
}
virtual ~base()
{
values.clear();
cout<<"base called"<<endl;
}
};
class derived : public base // derived class
{
public:
~derived(){
cout<<"derived called"<<endl;
}
};
int main()
{
derived *d = new derived;
base *b = new base;
b->initialize(static_cast<base *>(d)); /* filling list */
delete b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Q.1)为什么不调用派生类的析构函数,就像我在执行的基类析构函数一样values.clear()?
Q.2)如果基类析构函数是虚拟的,是否需要派生类析构函数定义?
Q1.因为您没有删除类型的对象derived.你这样做delete b;,删除了一个base.你也应该打电话delete d;.
此外,您应指定负责内存管理的对象.您的设计容易出错.你最好使用智能指针来防止歧义.此外,为了按照您的预期行事,析构函数应该是:
virtual ~base()
{
for ( int i = 0 ; i < values.size() ; i++ )
delete values[i];
values.clear();
cout<<"base called"<<endl;
}
Run Code Online (Sandbox Code Playgroud)
当然,通过这种方法,它将是未定义的行为调用delete d;你的main.
Q2.不,这个定义不是必需的.
| 归档时间: |
|
| 查看次数: |
3754 次 |
| 最近记录: |