0

假设我有

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接口使用。由于fooisvirtual和 is usedpolymorphic它不能被内联。所以它会被编译成多个obj文件。那么链接器如何解决这种情况呢?

4

1 回答 1

5

在类定义中定义的成员函数是隐式的inlineC++03 7.1.2.3)。
函数体是否真的在调用点被内联是无关紧要的。但是inline,只要所有定义都相同,您就可以对一个函数进行多个定义(一个定义规则不允许这样做)(C++03 7.1.2.2)。该标准要求链接器应该能够链接到(一个或)许多这些定义。(C++03 7.1.2.4)。

链接器如何做到这一点?

对此的标准规定:

  • 它要求函数定义应该存在于每个翻译单元中。链接器所要做的就是链接到在该翻译单元中找到的定义。
  • 它要求这个函数的所有定义应该完全相同,如果存在不同的定义,这消除了链接到特定定义的任何歧义。

C++03 7.1.2 函数说明符:
第 2 段:

带有 inline 说明符的函数声明(8.3.5、9.3、11.4)声明了一个内联函数。inline 说明符向实现表明,在调用点对函数体进行内联替换优于通常的函数调用机制。在调用点执行此内联替换不需要实现;然而,即使省略了这个内联替换,7.1.2 中定义的内联函数的其他规则仍应得到遵守。

第 3 段:

在类定义中定义的函数是内联函数。内联说明符不应出现在块作用域函数声明中

第 4 段:

内联函数应在使用它的每个翻译单元中定义,并且在每种情况下都应具有完全相同的定义(3.2)。

于 2013-02-08T14:51:48.817 回答