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

C++ Virtual keyword and System update

本文关键字:系统 更新 关键字 虚拟 C++      更新时间:2023-10-16

如果我有遗留的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->Method1((? 我知道虚函数表将更新为在派生类中调用method1((,但main((也必须更新如下:

int main()
{
​    A *a = new B;
​
​    a->Method1();
​}

输出:

B:方法1((

否则,将继续调用 A:Method1((。我已经在可视化工作室下验证了这一点。

无论如何,事实是 - 必须更新 main(( 违背了将 Method1(( 定义为虚拟的目的,因为您必须更改 main((,然后重新编译它,安装和部署它。

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

换句话说,您不会class B改进class A。您之所以class B,是因为您还有其他工作要做,这些工作在某种程度上与class A所做的工作有关。

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