在标头中实现的隐式内联虚函数
Implicit inline virtual function implemented in header
.h 文件中编写函数及其实现(隐式内联(,同时使用 virtual 关键字:
virtual void g(){cout<<"is Inline?"};
虚拟功能是否因为函数是在 .h 中实现而毫无意义?这是否被视为内联?
虚拟功能是否因为函数是在 .h 中实现而毫无意义?
不。 virtual
和inline
是完全独立的概念。
virtual
意味着在运行时根据需要根据调用函数的对象的动态类型选择要调用的函数。
inline
意味着您可以在多个翻译单元中定义函数,并且必须在使用它的任何翻译单元中定义它。这对于(对于某些编译器(是允许内联函数所必需的,但不会强制所有调用都内联。特别是,虚拟调用通常不会内联(除非可以在编译时确定动态类型(,因此virtual
肯定会保留其含义。
这是否被视为内联?
是的,但是(如上所述(这并不意味着所有调用都将内联。
虚拟功能是否毫无意义,因为该功能是 在 .h?
不。没有理由这么想。头文件经过预处理并复制粘贴到包含的任何位置。因此,最终它与在任何.cpp文件中实现g()
一样好。
这是否被视为内联?
是的。但这里的inline
并不意味着通常的解释是用函数调用的内容替换函数调用。 virtual
函数解析发生在运行时,因此绝对不能以这种(宏样式(方式内联。
这意味着,编译器保证为所有翻译(.cpp文件(单元仅生成 1 个定义。因此,链接器不会抱怨多个定义错误。
如果你声明你的函数virtual
,它是虚拟的,句点。但是,由于虚拟函数通常是在运行时选择的,因此编译器通常无法内联它们。如果在对象上调用该函数,编译器可能会内联该函数,因为可以在编译时解析调用。但它无法通过引用或指针内联调用,因为它无法在编译时解析动态类型。
考虑到这里的 inline
关键字和隐式内联对于编译器来说都不是必需的;它们只是建议。但virtual
关键字是强制性的。
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 分段 排序函数实现中的错误
- 无法去函数实现 vim
- C++ 20 中的运算符 == 和 <=> 应该作为成员还是自由函数实现?
- 为什么在这种情况下不调用我的虚拟函数实现?
- 我能否通过将函数实现为类对象方法来避免使用互斥锁
- 嵌套的模板结构构造函数实现
- C++接口的工厂函数实现
- 链表中的递归长度函数实现
- 我可以期望某些 STL 函数实现是可自动矢量化的吗?
- 如何将深拷贝构造函数实现到链表中?
- 虚拟 CTOR 的克隆函数实现是否有问题
- 没有捕获列表的 lambda 通常作为普通函数实现吗?
- C++二叉树打印函数实现
- C++:默认构造函数实现
- C++派生类中的纯虚函数实现
- 决定放置函数实现的位置
- 强制实施纯虚函数实现,可能使用不同的参数类型
- 如何让成员函数实现依赖于类的模板参数?
- 我们如何将Ostream函数作为类的成员函数实现,而不是作为朋友函数,以便我可以用作虚拟函数