C ++虚拟关键字和系统更新

时间:2018-05-26 15:05:14

标签: c++

如果我有如下遗留的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(),然后重新编译,安装和部署它。

1 个答案:

答案 0 :(得分:1)

您上面说的一切都是正确的。你似乎误解了虚方法的目的。目的不是为了避免在改进方法时重新编译和重新安装应用程序。实际上,您不会仅仅使用继承来改进方法。您使用继承来显示不同的类以某种方式相关。虚函数允许一些继承的类共享功能,而其他类则提供自己的功能。

换句话说,您不能class B改进class A。您创建了class B,因为您还有其他工作需要完成,这与class A完成的工作有关。

请注意,您可以使用接口样式(或混合)基类作为插件的父类。然后,您只需重新编译插件并让您的应用重新加载它。通常,基类将具有插件子类将实现的几个纯虚方法。