百度百科:虚函数定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数
不能声明为虚函数的函数有:
1、普通函数
2、构造函数
3、内联成员函数
4、静态成员函数
5、友元函数
1、普通函数
普通函数(非成员函数)只能被重载(overload),不能被重写(override),而且编译器会在编译时绑定函数。多态的运行期行为体现在虚函数上,虚函数通过继承方式来体现出多态作用,顶层函数不属于成员函数,是不能被继承的。
2、构造函数
构造函数本来就是为了明确初始化对象成员才产生的,然而虚函数是在不太了解细节的情况下来处理对象。然而现在如果把构造函数声明为虚函数,对象还没有创建就来处理“对象”,怕是霍金老人家会不同意。
另外,虚函数指针都会存放于虚函数表的,虚函数表存储在对象的内存中,所以声明虚函数时,必须要有对象正常构造。
3、内联成员函数
内联函数就是为了在代码中直接展开,减少函数调用花费的代价,虚函数是为了在继承后对象能够准确的执行自己的动作,这是不可能统一的。
4、静态成员函数
静态成员函数对于每个类来说只有一份代码,所有的对象都共享这一份代码,他也没有要动态绑定的必要性。不能被继承,只属于该类。
5、友元函数
C++不支持友元函数的继承,对于没有继承特性的函数没有虚函数的说法。友元函数不属于类的成员函数,不能被继承。