构造函数不可以是虚函数。因为类的虚函数表指针是在构造函数中初始化的,在虚表指针没有被正确初始化之前,我们不能调用虚函数。
构造函数和析构函数也不能调用虚函数,前者是因为虚表指针还没有被初始化,后者是因为虚表指针可能已经被析构了。
0i
存在虚函数的类都有一个一维的虚函数表,简称虚表。类的每个对象都有一个指向虚表开始的虚表指针。虚表是和类对应的,虚表指针是和对象对应的。
抽象类是指至少包含一个纯虚函数的类。
编译器在编译的时候发现类里有虚函数就会为该类创建一个虚表。编译器另外还为每个类的对象提供一个虚表指针,这个指针指向对象所属的类的虚表。在虚表指针没有被正确初始化之前,我们不能调用虚函数。虚表的创建和虚表指针的初始化都是在构造函数中完成的。
派生类的虚函数表存放重写的虚函数,当基类的指针指向派生类的对象时,调用虚函数时都会根据虚表指针来选择虚函数。 而基类的虚函数在派生类中已经被重写了,因此只能调用派生类的虚函数版本了。
**这也揭示了虚析构函数的作用,当基类指针指向派生类对象时,调用虚析构函数会先调用派生类的析构函数。如果析构函数不是虚函数,那么基类指针调用析构函数时只会调用基类的析构函数。
重载函数属于编译时多态,虚函数属于运行时多态。
构造函数可以是虚函数吗?构造函数和析构函数可以调用虚函数吗?虚表和虚表指针的概念
原文:https://www.cnblogs.com/conanpeng/p/12796371.html