C++ 不在构造函数和析构函数中调用虚函数

首先在构造函数或者是在析构函数中是可以调用虚函数的。但是我们最好不要这样做。

一、不在构造函数中调用虚函数

当我们在构造函数中调用虚函数时,一定调用的是基类的虚函数,即使此时你定义的是一个派生类的对象。
原因一:
在创建派生类对象时,一定首先调用的基类的构造函数,其次在调用的是派生类构造函数。问题就在于,当程序执行到基类的构造函数时,因为还没有调用到派生类的构造函数,所以此时派生类的成员还处于未初始化的阶段,而在虚函数中几乎可以肯定它会对派生类的成员进行操作,而此时派生类中的成员还没有初始化,那么这在C++中是绝对不可以的,所以它不能在基类中调用派生类的构造函数。
原因二:
在派生类对象的创建中,当他执行到基类的构造函数时,此时C++认为它并不是一个派生类对象,而是把它当做一个基类的对象,而虚函数又是在运行期间动态进行类型检查的,所以此时虚函数检查它为基类类型,所以它调用的就是基类的虚函数。

二、不在析构函数中调用虚函数

在派生类中的析构函数中调用虚函数时,会优先调用派生类中的虚函数,如果派生类中没有对虚函数进行重定义,那么它会调用基类的虚函数。

在基类的析构函数中调用的虚函数一定是基类的,不能调用派生类的,因为此时派生类的成员已经被销毁,所以无法调用。

三、总结

在基类的构造函数中,只能调用基类的虚函数
在派生类的构造函数中既可以调用基类的也可以调用派生类的
在基类的析构函数中,只能调用基类的虚函数
在派生类的析构中,既可以调用基类的,也可以调用派生类的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章