使用 virtual 关键字在 .h 文件中编写函数及其实现(隐式内联):
virtual void g(){cout<<"is Inline?"};
虚拟功能是否因为在.h中实现了功能而没有意义?这被认为是内联吗?
虚拟功能是否因为在.h中实现了功能而没有意义?
不virtual
,并且inline
是完全独立的概念。
virtual
意味着调用的函数是在运行时根据调用它的对象的动态类型来选择的。
inline
意味着您可以在多个翻译单元中定义该函数,并且必须在任何使用它的翻译单元中定义它。这对于允许内联函数是必要的(对于某些编译器),但并不强制所有调用都内联。特别是,虚拟调用通常不会被内联(除非动态类型可以在编译时确定),所以virtual
这里肯定会保留它的含义。
这被认为是内联吗?
是的,但是(如上所述)这并不意味着所有调用都将被内联。
虚拟功能是否因为在.h中实现了功能而没有意义?
不。没有理由这么觉得。头文件被预处理并复制粘贴到任何包含它的地方。g()
所以最终它和在任何 .cpp 文件中实现你的一样好。
这被认为是内联吗?
是的。但这里inline
并不意味着用其内容替换函数调用的通常解释。virtual
函数解析发生在运行时,因此绝对不能以那种(宏样式)方式内联。
这意味着,编译器保证只为所有翻译(.cpp 文件)单元生成 1 个定义。因此链接器不会抱怨多个定义错误。
如果你声明你的函数virtual
,它是虚拟的,句号。但是,由于通常在运行时选择虚函数,因此编译器通常无法内联它们。如果您在对象上调用函数,编译器可能会内联它,因为调用可以在编译时解析。但它无法通过引用或指针内联调用,因为它无法在编译时解析动态类型。
考虑到inline
这里的关键字和隐式内联对于编译器都不是强制性的;它们只是建议。但是virtual
关键字是强制性的。