虚函数是通过指针或引用调用函数时,通过虚函数表来确定调用的函数,在运行时确定。
内联函数是在编译时,将调用函数处插入内联函数的代码,省去了函数调用时的开销。
表面上看,虚函数不能为内联函数。我们在类中定义的函数都是内联函数,析构函数经常在类中定义,而析构函数又经常声明为虚函数,以前没有发现什么问题。
其实虚函数可以为内联函数,这与内联函数的定义没什么冲突。
内联函数到底要不要在调用处展开取决于怎么调用内联函数。
class A
{
A(){}
~A(){}
virtual void foo()
{
cout << "A::foo" << endl;
}
}
class B
{
virtual void foo()
{
cout << "B::foo" << endl;
}
}
A *a = new B();
int main()
{
a->foo();//不是内敛
a->A::foo();//内联
}
无论显式还是隐式,inline都只是一个申请,最终由编译器决定内联还是不内联
inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。
另外要注意,内联函数一般只会用在函数内容非常简单的时候,这是因为,内联函数的代码会在任何调用它的地方展开,如果函数太复杂,代码膨胀带来的恶果很可能会大于效率的提高带来的益处。内联函数最重要的使用地方是用于类的存取函数。