内联函数由关键词inline修饰,在函数声明和定义时都需要加上关键词inline。
内联函数直接将代码复制到调用位置,与一般函数不同由调用堆栈执行函数代码。
好处:避免了调用堆栈切换指令的开销,加快程序执行的速度
坏处:过长的代码被直接复制,增加了代码区的内存占用
所以一般在函数本身代码较短,功能简单的情况下使用内联函数
与宏定义相比:
#include虚函数using namespace std; #define SUM(x) x*x inline int fun(int x) { return x * x; } int main() { int a = SUM(2 + 3); //a直接由宏定义展开得到2+3*2+3=11 int b = fun(2 + 3); //b由内联函数传参计算得到(2+3)*(2+3)=25 return 0; }
在函数前加上vitual关键字,可以在子类中重写虚函数,也可以通过子类对象的引用或指针赋值父类对象表现多态。
虚函数可以是内联函数嘛可以,但是表现运行多态时不可以
内联函数在编译时复制到调用位置,运行多态在运行期间确定调用的是父类函数还是子类函数,无法直接通过内联确定复制的目标函数。
#includeusing namespace std; class Base{ public: inline virtual void func(){ cout << "I am Basen"; } virtual ~Base(){} }; class Derived:public Base{ public: inline void func(){ // 不写inline时隐式内联 cout << "I am Derivedn"; } }; int main(){ Base b; b.func(); //没有使用动态多态,在编译期能确定函数 Base *bptr = new Derived(); //运行期多态 bptr->func(); //在运行期才能确定调用的是子类的fun函数 delete bptr; bptr = nullptr; return 0; }



