内联虚拟函数真的是一个神话吗?
在代码审查中,评论“虚拟函数不需要内联”引发了以下问题:使用内联虚函数。尽管它们具有潜在的好处,但对其实用性仍存在疑问。
在直接在对象上调用函数的场景中,内联虚函数可能看起来比较合适。然而,有人可能想知道,如果使用对象来调用方法,为什么还要使用虚函数。
下面的代码片段举例说明了这个问题:
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() { TempDerived aDerivedObj; // Compiler expands virtual functions aDerivedObj.myVirtualFunction(); // Object type for Temp* is known Temp* pTemp = &aDerivedObj; pTemp->myVirtualFunction(); return 0; }
虽然编译器可以内联虚函数当已知对象的确切类(例如,aDerivedObj)时调用,而当通过指针访问对象时则不能这样做(pTemp)。
这个限制提出了一个问题:内联虚函数是否应该避免,因为它们的扩展经常受到限制?
答案:
虚拟函数在某些情况下可以内联,如 C FAQ 中所述:
“内联虚拟调用唯一可以被内联是指编译器知道作为虚函数调用目标的对象的“确切类”,只有当编译器具有实际对象而不是对象的指针或引用时,才会发生这种情况。”
以上是内联虚拟函数是一个神话,还是只是被误解了?的详细内容。更多信息请关注PHP中文网其他相关文章!