- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试了解一个类的 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() {}
};
这是我的场景:
一个非虚方法被添加到基类A:
void method3() {};
在基类 A 中添加了一个带有主体的虚方法:
virtual void method3() {};
在基类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/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!