标题中实现的隐式内联虚函数

时间:2012-08-23 11:41:28

标签: c++ function header virtual inline

使用虚拟关键字时,在.h文件中编写函数及其实现(隐式内联):

virtual void g(){cout<<"is Inline?"};

虚拟功能是否无意义,因为该功能是在.h中实现的? 这被认为是内联吗?

3 个答案:

答案 0 :(得分:7)

  

虚拟功能是否无意义,因为该功能是在.h?

中实现的

没有。 virtualinline是完全独立的概念。

virtual表示根据调用的对象的动态类型,在运行时根据调用的函数选择要调用的函数。

inline表示您可以在多个翻译单元中定义该功能,并且必须在使用它的任何翻译单元中定义该功能。这对于某些编译器来说是必要的,以允许函数内联,但不强制所有调用都被内联。特别是,虚拟调用通常不会内联(除非可以在编译时确定动态类型),因此virtual肯定会在此处保留其含义。

  

这被认为是内联吗?

是的,但(如上所述)并不意味着所有电话都会被内联。

答案 1 :(得分:1)

  

虚函数是否无意义,因为函数是   在.h?

中实施

<强>都能跟得上即可。没理由感觉如此。头文件经过预处理并复制粘贴,无论它包含在何处。所以最终它与在任何.cpp文件中实现g()一样好。

  

这被认为是内联吗?

即可。但是这里inline并不意味着用其内容替换函数调用的通常解释。 virtual函数解析在运行时发生,因此绝对不能以(宏样式)方式内联 这意味着,编译器保证仅为所有转换(.cpp文件)单元生成1个定义。因此链接器不会抱怨多个定义错误。

答案 2 :(得分:0)

如果您声明函数virtual,则它是虚拟的,句点。但是,由于虚拟函数通常是在运行时选择的,因此通常编译器无法内联它们。如果在对象上调用该函数,则编译器可以内联它,因为可以在编译时解析调用。但它无法通过引用或指针内联调用,因为它无法在编译时解析动态类型。

考虑到编译器不强制inline关键字而不是隐式内联;他们只是建议。但virtual关键字是强制性的。