如果一个类的析构函数是非虚的,那么就意味着它不会作为基类来使用(这种类就是我们所熟知的“实体类”)。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号