2015-09-07 86 views
0

答案 “调用非虚拟函数将使用功能的同一类的指针类型,无论对象是一些其他派生类型实际创建的。而调用虚函数无论使用什么样的指针,都可以使用原始分配的对象类型中的函数。“ 对我来说是最好的问题链接 What are the differences between overriding virtual functions and hiding non-virtual functions?优势虚拟功能

但是,我仍然没有看到使虚拟功能的好处。为什么不把它具体化并在必要时重写该函数?

回答

0

所有在您的链接的答案是相当复杂的,因为他们实际上回答的问题比居然问:-)

我试图使它更容易(可以自求多福):

概念的虚拟功能可以保证无论你使用指针(见链接Parent* p2Child* cp的例子)在一类具有一些涉及继承,它总是会调用继承链中最“年轻”的孩子的实现。

示例:如果您具有完全相同的函数定义和全部虚拟的“child - > parent”和“grandchild - > child - > parent”,现在可以假设在所有中调用“grandchild :: f2”情况。如果您在父项中省略了“虚拟”关键字,则可能会调用不同的函数,具体取决于您用来访问实例的指针。

所以。这有什么用?想象一下,你有一个基于模板的集合,并希望将子集放入定义为父类型集合list<Parent*>的集合中。如果你现在调用一个你从列表中获取的元素的函数,你可以期望调用这个孩子的函数(定义)!如果您在f2()定义中省略“虚拟”关键字,则会调用父项功能,这在大多数情况下可能是意外/不期望的。

还好吗? :-)