gpt4 book ai didi

c++ - 如果在 C++ 中的基类中添加虚函数或非虚函数,是否必须重新编译整个类层次结构?

转载 作者:太空宇宙 更新时间:2023-11-04 12:35:30 24 4
gpt4 key购买 nike

我正在尝试了解一个类的 vtable 在 C++ 中有多敏感,为此,我需要知道对于我的 3 个更改场景是否需要重新编译整个类层次结构(总共 3 个头文件)列表如下。首先,这是我的类层次结构:

class A {
public:
virtual void method1() = 0;
virtual void method2() = 0;
virtual ~A() {}
};

class B : public A {
public:
virtual void method1() {};
virtual void method2() {};
virtual ~B() {}
};

class C : public A {
public:
virtual void method1() {};
virtual void method2() {};
virtual ~C() {}
};

这是我的场景:

  1. 一个非虚方法被添加到基类A:

    void method3() {};
  2. 在基类 A 中添加了一个带有主体的虚方法:

    virtual void method3() {};
  3. 在基类A中添加一个纯虚方法:

    virtual void method3() = 0;

在场景 1 中,没有对 vtable 进行任何更改。 B和C还需要重新编译吗?

在场景 2 中,是否会为基数 A、B 和 C 重建 vtable?

我知道场景 3 将强制类 B 和 C 为新方法提供实现。因此,必须重新编译整个层次结构。

最佳答案

C++ 单一定义规则清楚地表明,如果您要将不同翻译单元(即文件)中的实体定义必须全部相同,则要将它们链接在一起。因此,如果您完全更改类的定义,公共(public)的、私有(private)的、虚拟的、非虚拟的无论什么,所有翻译单元使用该定义的必须查看新的类定义。这将需要重新编译它。

如果不这样做,则格式错误,但不需要诊断(链接器错误)。所以你的项目可能看起来链接得很好。事实上,它在某些情况下可能确实有效。但是,没有任何东西可以保证它们在哪些情况下会起作用,在哪些情况下不会起作用。

关于c++ - 如果在 C++ 中的基类中添加虚函数或非虚函数,是否必须重新编译整个类层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56572829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com