c++ - 虚拟覆盖和二进制兼容性

标签 c++ overriding virtual binary-compatibility

我有一个可以编译为共享库(或 Windows 中的 DLL)的库。它有一个从另一个库中的另一个类派生的类。基类有一些虚拟方法,我的类重写了其中一些方法。例如:

class Base {
public:
    virtual void method1();
    virtual void method2();
    virtual void method3();
};

class Derived: public Base {
public:
    virtual void method2();
};

现在我发现其中一个虚拟方法不太适合我的类。目前它不会重写此方法,因此我也想重写它以修复其行为:

class Derived: public Base {
public:
    virtual void method2();
    virtual void method3();
};

这会破坏与旧版本库的二进制兼容性吗?

据我了解,它与仅仅添加虚拟函数不同,因为虚函数表中虚拟方法的数量和顺序保持不变。唯一的区别是我的类的 vtable 中的特定条目现在将包含不同的值。这是正确的吗?

我也非常确定当前使用我的库的应用程序都没有使用该方法,因为它完全损坏并且永远无法工作。所以我不担心会破坏对基本方法实现的现有调用。我只是想确保我不会破坏任何其他东西。

最佳答案

既然你谈论的是 DLL,我假设这是 Visual Studio/Windows 中的 C++。添加覆盖不会破坏二进制兼容性,因为 vtable 的大小不会改变。但是,如果您不重新编译实例化 Derived 新实例的所有代码,则可能会导致一些不希望的结果。这是因为 vtable 是由实例化源初始化的,而不是由实现 Derived 的类的源初始化。

关于c++ - 虚拟覆盖和二进制兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7351476/

相关文章:

c++ - 指向函数和派生类的指针

c++ - 斐波那契数列

c# - 覆盖方法中访问修饰符的作用是什么?

delphi - 覆盖 SetEnabled 与处理消息 CM_ENABLEDCHANGED

调用虚方法时 C++ 访问冲突

virtual - 在KVM中如何将VM克隆到具有不同磁盘空间的VM

c++ - 清空对象的最佳方法是什么?

c++ - LLU 号码后缀错误

c# - 在一个方法被覆盖的情况下使用相同的类

python - 使用Python 3在Windows中创建虚拟环境