其他分享
首页 > 其他分享> > C:使方法成为虚拟的含义

C:使方法成为虚拟的含义

作者:互联网

应该是一个新手问题……

我在现有的类A中有现有的代码,我想扩展它以覆盖现有的方法A :: f().

所以现在我想创建类B来覆盖f(),因为我不想只改变A :: f(),因为其他代码依赖于它.

为此,我需要将A :: f()更改为虚拟方法.

我的问题是除了允许动态调用方法(使用B的实现而不是A)之外还有其它方法可以使方法成为虚拟吗?我打破了某种优秀的编程习惯吗?这会影响试图使用A :: f()的任何其他代码吗?

请告诉我.

谢谢,
JBU

编辑:我的问题更多的是让别人的方法虚拟有什么不对吗?即使你没有改变其他人的实现,你仍然需要进入某人的现有代码并对声明进行更改.

解决方法:

如果你在基类中创建虚拟函数,那么从它派生的任何东西都会将它虚拟化.

一旦虚拟,如果你创建一个A的实例,那么它仍然会调用A :: f.

如果您创建B的实例并将其存储在类型A *的指针中.然后你调用A * :: – > f,然后它将调用B的B :: f.

至于副作用,除了轻微(不明显)的性能损失外,可能不会有任何副作用.

也有一个非常小的副作用,可能有一个C类也派生自A,它可能实现C :: f,并期望如果调用A * :: – > f,那么它期望A :: f被调用.但这并不常见.

但更有可能的是,如果C存在,那么它根本不会实现C :: f,在这种情况下一切都很好.

但是要小心,如果你使用的是已经编译好的库并且要修改它的头文件,那么你期望工作的东西可能不会.您将需要重新编译标头和源文件.

您可以考虑执行以下操作以避免副作用:

>创建一个从A派生的类型A2并使其成为虚拟的

>使用A2类型的指针而不是A
>从A2类型中导出B.
>这样使用A的任何东西都会以相同的方式保证

根据您的需要,您也可以使用has-a关系而不是is-a.

标签:c,virtual,implementation,overriding
来源: https://codeday.me/bug/20191008/1873997.html