虚函数:构造函数为什么不能为虚函数,析构函数为什么必须是虚函数

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

从存储空间角度
虚函数对应一个虚表,可是这个虚表其实是存储在对象的内存空间的。
那么问题来了,如果构造函数是虚函数,就要通过虚表来调用,可是对象空间还没有实例化,也就是内存空间还没有,无法找到虚表,所以构造函数不能是虚函数。

从使用角度
虚函数主要用于在信息不全的情况下,能够使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义。
另外,虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数,从而实现多态,也就是实现“一个接口,多种方法”。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此规定构造函数不能是虚函数。

析构函数为什么必须是虚函数?

因为析构函数的调用顺序是先调用子类的析构函数,再向外调用父类的析构函数。
如果父类的析构函数不是虚函数的话,就会直接调用父类的析构函数,而不调用子类的析构函数,就会造成子类的有些内存啥的来不及释放,造成内存泄露。

发布了19 篇原创文章 · 获赞 21 · 访问量 989

猜你喜欢

转载自blog.csdn.net/weixin_43742894/article/details/104909513