Leo*_*eon 3 c++ polymorphism virtual-functions
是否可以通过简单地向基类添加新的虚函数来改变程序的观察行为?我的意思是不必对代码进行其他更改.
以下程序打印正常.取消注释虚拟功能,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(),从静态到动态的变化.
二进制不兼容.
如果您有一个可外部加载的模块(即DLL),那么它将使用基类的旧定义,您将遇到问题.或者如果加载程序具有旧的定义并且DLL具有新的,那么它也是同样的问题.如果由于某种原因使用原始二进制复制(不是任何类型的序列化)将对象保存在文件中,这也是一个问题.
这与虚函数的C++规范无关,而是大多数编译器如何实现它们.
一般来说,如果类的"接口"发生更改(基类与否),则应重新编译使用该类的所有内容.