1.static成员函数不能是虚函数
虚函数存在于有继承关系的类的对象中,在派生类中覆盖了基类的虚函数,实现了动态绑定。通过基类的指针或引用调用派生类版本。
static成员函数在继承关系中只存在一份。是属于类的,而不受限于某个对象,不存在this指针。在派生类中的继承的static函数和基类是一个函数。因此~。
2.inline成员函数不能是虚函数
函数的inline属性是在编译时静态确定的,而virtual则是在运行时确定的。肯定不能同时存在。
inline函数建议编译程序在调用该函数的地方将函数代码展开来插入到caller的代码中,这个只是一种指示,至于会不会被内敛,编译程序要看该函数是否存在多重循环,或复杂的函数等。
3.构造函数不能是虚函数
构造函数主要是完成对象的初始化功能,在构造函数运行的过程中对象还没有完全初始化。
而虚函数是对象的虚函数指针vptr调用vtb中的函数。如果构造函数是虚函数的话,派生类的构造函数则调用的是基类的构造函数,显然不对。
4.赋值操作符不能是虚函数
将赋值操作符定义为虚函数是无意义的。赋值操作符的参数是该类的const引用类型,所以 派生类的赋值操作符的参数是本类的const引用类型,与基类的赋值操作符是不一样的。如果赋值操作符是虚函数的话,则派生类实现的则是以基类的const引用类型,与派生类的赋值操作符是不符的。
5.析构函数通常为虚函数
在删除指向动态内存分配的指针时,需要运行析构函数在释放内存之前删除对象。在处理继承层次的指针时,指针的静态类型可能与被删除对象的动态类型不同。在删除指针时可能删除派生类的基类类型指针。要正确调用析构函数,通常将基类的析构函数定义为虚函数。
6.构造函数与析构函数中的虚函数
构造派生类对象时首先运行基类的构造函数初始化基类部分,此时派生类部分是未初始化的。
在撤销派生类对象时首先是撤销派生类部分。
构造函数与析构函数在运行过程中,对象都是不完整的。如果调用虚函数(或间接调用虚函数),则运行的是为构造函数或析构函数自身类型的版本。