c++技巧---为什么没有虚析构函数的类继承是危险的
帐 号: 注册帐号
密 码:  找回密码
      记住用户名和密码
c++技巧---为什么没有虚析构函数的类继承是危险的

如果一个类的析构函数是非虚的,那么就意味着它不会作为基类来使用(这种类就是我们所熟知的“实体类”)。std::string,std::complex,以及std::vector都是实体类。为什么不推荐继承这些类呢?当你使用公共继承时,你就会在基类与派生类之间创建一种is-a的关系。因此,基类的指针和引用实际上可以指向一个派生的对象。由于析构函数不是虚的,所以当您删除这样一个对象时,C++将不会调用整个析构链。例如:

class A{public:  ~A() // non virtual  {  // ...  }};class B: public A /* 不好; A 没有虚析构函数*/{public:  ~B()  {  // ...  }};int main(){ A * p = new B; /*貌似没什么问题*/ delete p; /*问题出现, B的析构未被调用*/}
 
  没有调用对象的析构所带来的结果是不确定的。因此,你不应该公开继承这样的类。尤其是,不要继承STL容器和std::string。

copyright:2016-2020|邮箱:imalib@vip.163.com

蜀ICP备16020986号