C++的虚函数可以是内联函数吗?

结论: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只是行使程序员的“建议权”,所以编译器没有对函数进行展开,保留函数的机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值