应该是一个新手问题……
我在现有的类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.