虚函数用于实现运行时的多态,或者称为晚绑定或动态绑定。而内联函数用于提高效率。
内联函数的原理是,在编译期间,对调用内联函数的地方的代码替换成函数代码。内联函数对于程序中需要频繁使用和调用的小函数非常有用。
默认地,类中定义的所有函数,除了虚函数之外,会隐式地或自动地当成内联函数(注意:内联只是对于编译器的一个请求,编译器可以自己决定是否进行内联)。
无论何时,使用基类指针或引用来调用虚函数,它都不能为内联函数(因为调用发生在运行时)。
但是,无论何时使用类的对象(不是指针或引用)来调用时,可以当做是内联,因为编译器在编译时确切知道对象是哪个类的。
#include <iostream>
using namespace std;
class Base {
public:
virtual void who() { cout << "I am Base" << std::endl; }
};
class Derived : public Base {
public:
void who() { cout << "I am Derived" << std::endl; }
};
int main() {
// 此处的虚函数who(),是通过类的具体对象来调用的,编译期间就能确定了,所以它可以是内联的。
Base b;
b.who();
// 此处的虚函数是通过指针调用的,需要在运行时期间才能确定,所以不能为内联。
Base* ptr = new Derived();
ptr->who();
return 0;
}
运行结果:
I am Base
I am Derived
语法上面来讲,在基类和子类的who函数前面加上inline关键字,是可以正常编译,运行的。
class Base
{
inline virtual void who() {..........}
}
class Derived : public Base
{
inline void who() {............}
}