结论:C++的虚函数可以声明为内联函数,但是编译器会智能进行处理,会取消内联的属性。
概念
- 虚函数
虚函数是为了实现多态的机制,需要在基类中进行声明,实现用基类的指针指向派生类的实例。这个指向是“动态”的,也就是说在编译阶段是不知道要指向哪个基类的,程序运行后,根据类型进行动态绑定。
- 内联函数
内联函数是为了提升程序执行效率而产生的指令。用法是在函数前进行inline的关键字添加。内联函数虽然叫“函数”,但却不进行函数的调用,严格意义上不是一个函数。内联函数的实现机制是在编译阶段直接将函数进行展开,不进行函数调用的机制,也就没有压栈出栈的机理,故而提升程序的运行效率。一般在简短的语句上进行内联函数的声明。比如返回标志 return flag;
需要注意的是:inline函数只是程序员的建议,编译器可以忽略这种建议。比如将一个1000行的代码声明为inline函数,编译器仍然会忽略这个inline,将这个函数还原为普通函数。
因此,并不是所有的inline函数声明都会真正意义上成为内联函数,而是取决于编译器如何选择,取决于编译器的实现和函数体的大小。
示例代码
#include <iostream>
using namespace std;
class Base{
public:
Base(){}
~Base(){}
inline virtual void Init(){
cout<<"Base Init"<<endl;
}
};
class Drive: public Base{
public:
void Init()override{
cout<<"Drive Init"<<endl;
}
};
int main(){
Base *p = new Drive;
p->Init();//"Drive Init"
return 0;
}
程序结果:
Drive Init
结论:内联函数声明为虚函数后,因为虚函数是通过虚函数表进行的多态实现,所以必然有函数的调用机制,但是虚函数是跳过函数实现的,所以出现矛盾,因为inline只是行使程序员的“建议权”,所以编译器没有对函数进行展开,保留函数的机制。