链接器如何处理在多个标头中定义的虚拟函数
How does linker deal with virtual functions defined in multiple headers?
假设我有
Base.h
class Base
{
virtual void foo() {...}
};
Derived1.h
class Derived1 : public Base
{
virtual void foo() {...}
};
Derived2.h
class Derived2 : public Base
{
virtual void foo() {...}
};
头Derived1.h
包含在多个源文件中,Derived1
类也通过Base
接口使用。由于foo
是virtual
并且是使用polymorphic
的,所以它不能内联。因此,它将被编译在多个obj
文件中。链接器如何解决这种情况?
类定义中定义的成员函数是隐式inline
(C++03 7.1.2.3)。
函数体是否真的在调用时内联是无关紧要的。但是inline
允许您拥有一个函数的多个定义,只要所有定义都相同(这是一个定义规则不允许的)(C++03 7.1.2.2)。标准要求链接器应该能够链接到这些定义中的(一个或多个)。(C++03 7.1.2.4)。
链接器是如何做到这一点的
对此的标准规定如下:
- 它要求每个翻译单位都有职能定义。链接器所要做的就是链接到该翻译单元中的定义
- 它规定,该职能的所有定义都应完全相同,这消除了在存在不同定义的情况下链接到特定定义的任何歧义
C++03 7.1.2函数说明符:
第2段:
带有内联说明符的函数声明(8.3.5、9.3、11.4)声明了一个内联函数。内联说明符向实现指示,与通常的函数调用机制相比,在调用点对函数体的内联替换更可取。在调用点执行此内联替换不需要实现;然而,即使省略了这种内联替换,仍应遵守7.1.2中定义的内联函数的其他规则。
第3段:
类定义中定义的函数是内联函数。内联说明符不应出现在块作用域函数声明上
第4段:
内联函数应在使用它的每个翻译单元中定义,并且在任何情况下都应具有完全相同的定义(3.2)
相关文章:
- 在命名空间中定义函数还是限定函数
- 为什么在定义函数之前先声明它
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 这个c++代码是如何在没有定义函数的情况下运行的
- 具有外部"c"和程序集的未定义函数
- 已定义函数时出现 G++ "未定义的引用"错误
- 将自定义函数传递到基抽象类中以延迟执行
- C++使用 rand 定义函数语法
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题
- 将具有固定签名的自定义函数名称注入 CRTP
- 使用定义函数模板别名
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 在内联程序集中定义函数和从 C++ 调用时出现问题
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 声明和定义函数静态会产生"undefined reference to function_name()"
- 朋友定义函数的名称空间是什么
- 介子 对用户定义函数的未定义引用
- 如何使用 "using" 关键字定义函数原型/签名
- 在 C 结构中定义C++函数