如果我有如下遗留的c ++代码:
class A
{
virtual void Method1() { cout << "A::Method1()" << std::endl; }
}
int main()
{
A *a = new A;
a->Method1();
}
我想添加或更新以下新代码:
class B : A
{
void Method1() { cout << "B:Method1()" << std::endl; }
}
如何更新系统,以便派生类中的method1()而不是基类中的method1(),方法是a-&gt; Method1()?我知道虚函数表将更新为在派生类中调用method1(),但main()也必须按如下方式更新:
int main()
{
A *a = new B;
a->Method1();
}
输出:
B:方法1()
否则A:Method1()将继续被调用。我已在visual studio下验证了这一点。
无论如何,必须更新main()会使将Method1()定义为虚拟的目的失败,因为您必须更改main(),然后重新编译,安装和部署它。
答案 0 :(得分:1)
您上面说的一切都是正确的。你似乎误解了虚方法的目的。目的不是为了避免在改进方法时重新编译和重新安装应用程序。实际上,您不会仅仅使用继承来改进方法。您使用继承来显示不同的类以某种方式相关。虚函数允许一些继承的类共享功能,而其他类则提供自己的功能。
换句话说,您不能class B
改进class A
。您创建了class B
,因为您还有其他工作需要完成,这与class A
完成的工作有关。
请注意,您可以使用接口样式(或混合)基类作为插件的父类。然后,您只需重新编译插件并让您的应用重新加载它。通常,基类将具有插件子类将实现的几个纯虚方法。