共有五种函数不能声明为虚函数,即普通函数(非成员函数)、构造函数、内联函数、静态函数、友元函数。
首先说明两点:
(1)虚函数是为了实现多态,而多态是属于动态联编,在运行时确定调用哪个函数。
(2)虚函数调用时,类之间需要有公有继承 +继承关系 + 基类指针或引用调用。
(1)普通函数为啥不能是虚函数?
原因:多态是依托于类的,要声明的多态的函数前提必须是虚函数。
(2)构造函数为啥不能是虚函数?
原因:多态是依托于类的,多态的使用必须是在类创建以后,而构造函数是用来创建构造函数的,所以不行。
具体的原因:虚表指针的初始化时在构造函数进行的,而虚函数需要放到虚表中。在调用虚函数前,必须首先知道虚表指针,此时矛盾就出来了。
(3)内联函数为啥不能是虚函数?
原因:内联函数属于静态联编,即内联函数是在编译期间直接展开,可以减少函数调用的花销,即是编译阶段就确定调用哪个函数了。但是虚函数是属于动态联编,即是在运行时才确定调用哪一个函数。显然这两个是冲突的。
(4)静态函数为啥不能使虚函数?
原因:
<1>从技术层面上说,静态函数的调用不需要传递this指针。但是虚函数的调用需要this指针,来找到虚函数表。相互矛盾
<2>从存在的意义上说,静态函数的存在时为了让所有类共享。可以在对象产生之前执行一些操作。与虚函数的作用不是一路的。
(5)友元函数为啥不能是虚函数?
原因:C++不支持友元函数的继承,不能继承的函数指定不是虚函数