确定基类有虚析构函数


class A
{
public:
A()
{
cout
<<"A constructor"<<endl;
}
~A()
{
cout
<<"A destructor"<<endl;
}
};

class B: public A
{
public:
B()
{
cout
<<"B constructor"<<endl;
}
~B()
{
cout
<<"B destructor"<<endl;
}

};
int main()
{
A
* p =new B();
delete p;
return 0;
}

  执行结果:

Effective C++ 学习笔记(11)

对此解释:C++语言标准规定,当通过基类指针删除派生类的对象,而基类又没有虚析构函数,结果是不确定的。

对此,将A的析构函数改为虚函数:

class A
{
public:
A()
{
cout
<<"A constructor"<<endl;
}
virtual ~A()
{
cout
<<"A destructor"<<endl;
}
};

  执行结果:

Effective C++ 学习笔记(11)

  结果正确。

以上我们是在堆上分配的内存。

改写main函数,在栈上分配:

int main()
{
B b;

return 0;
}

  结果同上。分配在栈上的对象自动调用构造函数与析构函数。

相关文章:

  • 2021-08-26
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-05-26
  • 2021-08-14
  • 2021-11-06
  • 2021-11-13
  • 2021-09-06
  • 2021-06-29
  • 2022-02-27
相关资源
相似解决方案