虚函数是类的成员函数,在基类中用关键词virtual声明并且可以在派生类中被重写(覆盖)。他们被用来实现运行时多态(后期绑定或者动态绑定)。
内联函数是在编译的时候用来替换到函数调用时的位置。在编译时,当一个内联函数被调用时,内联函数的代码会被插入或替换到内联函数被调用的位置。当程序很小并且被项目多次调用时,内联函数会提高效率。
默认情况下, 在类内定义的函数被隐式的视为内联函数,除了虚函数
Note: 内联与否由编译器决定。
虚函数可以是内联的吗?
当一个虚函数使用基类的引用或者指针时不能是内联的,因为该调用在运行时解析。
但当调用类的对象(非引用或指针)时,虚函数可以是内联的,因为编译器在编译时知道对象的确切类。
Example:
#include <iostream>
using namespace std;
class Base {
public:
virtual void who() {
cout << "I am Base\n";
}
};
class Derived : public Base {
public:
void who() {
cout << "I am Derived\n";
}
};
int main() {
// Part 1
Base b;
b.who();
// Part 2
Base* ptr = new Derived();
ptr->who();
return 0;
}
Output
I am Base
I am Derived
解释 :在Part1,因为类的对象是在编译时解析的,所以可以是内联的。在Part2,虚函数通过指针调用,所以它不能被内联