是否可以通过在基类中添加新的虚函数来中断代码?

Leo*_*eon 3 c++ polymorphism virtual-functions

是否可以通过简单地向基类添加新的虚函数来改变程序的观察行为?我的意思是不必对代码进行其他更改.

Leo*_*eon 5

以下程序打印正常.取消注释虚拟功能,B它将开始打印CRASH!.

#include <iostream>

struct B
{
    //virtual void bar() {}
};

struct D : B
{
    void foo() { bar(); }
    void bar() { std::cout << "OK" << std::endl; }
};

struct DD : D
{
    void bar() { std::cout << "CRASH!" << std::endl; }
};

int main()
{
    DD d;
    d.foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题是,一个虚函数后,B::bar()引入了呼叫的有约束力bar()D::foo(),从静态到动态的变化.

  • 但这首先是"虚拟"功能的目的......这里没有什么令人惊讶的:-).只要你在派生类中有一个函数签名是相同的,但是在其中一个基础中的`virtual`,它就会自动被覆盖.来自略微不同签名的错误部分是带来`override`关键字的原因 (2认同)

Som*_*ude 5

二进制不兼容.

如果您有一个可外部加载的模块(即DLL),那么它将使用基类的旧定义,您将遇到问题.或者如果加载程序具有旧的定义并且DLL具有新的,那么它也是同样的问题.如果由于某种原因使用原​​始二进制复制(不是任何类型的序列化)将对象保存在文件中,这也是一个问题.

这与虚函数的C++规范无关,而是大多数编译器如何实现它们.

一般来说,如果类的"接口"发生更改(基类与否),则应重新编译使用该类的所有内容.