当我收到一条代码审查评论说虚函数不需要内联时,我得到了这个问题。
我认为内联虚函数可以在直接在对象上调用函数的场景中派上用场。但我想到的相反论点是——为什么要定义虚拟然后使用对象来调用方法?
最好不要使用内联虚函数,因为它们几乎从未扩展过?
我用于分析的代码片段:
class Temp { public: virtual ~Temp() { } virtual void myVirtualFunction() const { cout<<"Temp::myVirtualFunction"<<endl; } }; class TempDerived : public Temp { public: void myVirtualFunction() const { cout<<"TempDerived::myVirtualFunction"<<endl; } }; int main(void) { TempDerived aDerivedObj; //Compiler thinks it's safe to expand the virtual functions aDerivedObj.myVirtualFunction(); //type of object Temp points to is always known; //does compiler still expand virtual functions? //I doubt compiler would be this much intelligent! Temp* pTemp = &aDerivedObj; pTemp->myVirtualFunction(); return 0; }
有时可以内联虚函数。优秀C++ 常见问题的摘录:
“内联虚调用唯一可以内联的情况是当编译器知道作为虚函数调用目标的对象的“确切类”时。只有当编译器有一个实际对象而不是指针或对对象的引用。即,使用本地对象、全局/静态对象或组合内的完全包含对象。