码迷,mamicode.com
首页 > 其他好文 > 详细

构造函数和析构函数可以是虚函数吗

时间:2020-05-14 19:36:26      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:而且   mda   基类   http   delete   补充   释放   需要   创建   

转:https://www.cnblogs.com/ktao/p/7563289.html

1. 为什么构造函数不能为虚函数?

    虚函数的调用需要虚函数表指针,而该指针存放在对象的内存空间中;若构造函数声明为虚函数,那么由于对象还未创建,还没有内存空间,更没有虚函数表地址用来调用虚函数——构造函数了。
 
2. 为什么析构函数可以为虚函数,如果不设为虚函数可能会存在什么问题?
    首先析构函数可以为虚函数,而且当要使用基类指针或引用调用子类时,最好将基类的析构函数声明为虚函数,否则可以存在内存泄露的问题。
    举例说明:
    子类B继承自基类A;A *p = new B; delete p;
  1) 此时,如果类A的析构函数不是虚函数,那么delete p;将会仅仅调用A的析构函数,只释放了B对象中的A部分,而派生出的新的部分未释放掉。
     2) 如果类A的析构函数是虚函数,delete p; 将会先调用B的析构函数,再调用A的析构函数,释放B对象的所有空间。
    补充: B *p = new B; delete p;时也是先调用B的析构函数,再调用A的析构函数。

构造函数和析构函数可以是虚函数吗

标签:而且   mda   基类   http   delete   补充   释放   需要   创建   

原文地址:https://www.cnblogs.com/cs0915/p/12890483.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!