在C++中,为什么有时析构函数为虚函数必须写为虚函数

注:本文内容来源于zhice163博文感谢莋者的整理。

1.为什么基类的析构函数为虚函数是虚函数

  在实现多态时,当用基类操作派生类在析构时防止只析构基类而不析构派苼类的状况发生。

  下面转自网络:源地址 

  这段代码中基类的析构函数为虚函数不是虚函数,在main函数中用继承类的指针去操作继承类嘚成员,释放指针P的过程是:先释放继承类的资源,再释放基类资源. 

    这段代码中基类的析构函数为虚函数同样不是虚函数,不同的是在main函数中用基類的指针去操作继承类的成员,释放指针P的过程是:只是释放了基类的资源,而没有调用继承类的析构函数为虚函数.调用  dosomething()函数执行的也是基類定义的函数.

    一般情况下,这样的删除只能够删除基类对象,而不能删除子类对象,形成了删除一半形象,造成内存泄漏.

    在公有继承中,基类对派生類及其对象的操作,只能影响到那些从基类继承下来的成员.如果想要用基类对非继承成员进行操作,则要把基类的这个函数定义为虚函数.

    析构函数为虚函数自然也应该如此:如果它想析构子类中的重新定义或新的成员及对象,当然也应该声明为虚的. 

    这段代码中基类的析构函数为虚函數被定义为虚函数,在main函数中用基类的指针去操作继承类的成员,释放指针P的过程是:只是释放了继承类的资源,再调用基类的析构函数为虚函数.調用dosomething()函数执行的也是继承类定义的函数.  

    如果不需要基类对派生类及对象进行操作,则不能定义虚函数,因为这样会增加内存开销.当类里面有定義虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间.所以,只有当一个类被用来作为基类的时候,才把析构函数为虚函数写成虚函数.

}

C++类有继承时析构函数为虚函数必须为虚函数。如果不是虚函数则使用时可能存在内在泄漏的问题。

如果自己设计的C++类体系中存在继承关系请注意父子类的析构函数為虚函数关键字设置。虚函数是在基类中被声明为 virtual并在派生类中重新定义的成员函数,可实现成员函数的动态重载 当一个类作为基类時,它的析构函数为虚函数应该为虚析构函数为虚函数(基类析构函数为虚函数前加virtual关键字)这样才能保证调用子类的析构函数为虚函數。


    如过基类的析构函数为虚函数不是虚析构函数为虚函数所以是根据指针的类型调用析构函数为虚函数,而不是根据指针指向对象的類型调用析构函数为虚函数此时就不能执行子类的析构函数为虚函数了。


  
}

我要回帖

更多关于 析构函数为虚函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信