答案 “调用非虚函数将使用与指针类型相同的类中的函数,无论该对象是否实际创建为其他派生类型。而调用虚函数将使用原始分配对象类型中的函数,不管你使用什么样的指针。“ 在问题链接中对我来说是最好的 What are the differences between overriding virtual functions and hiding non-virtual functions?
但是,我仍然没有看到使功能成为虚拟的好处。为什么不在必要时使其具体并覆盖功能?
答案 0 :(得分:0)
您链接中的所有答案都非常复杂,因为他们实际上回答的问题多于实际问题: - )
我试着让它更容易(让我们希望最好):
虚函数的概念允许您保证在涉及某些继承的类上使用的任何指针(请参阅链接Parent* p2
或Child* cp
中的示例),它将始终调用"最小的"孩子在继承链中的实现。
示例:如果您有"孩子 - >父"和"孙子 - >孩子 - >父"具有完全相同的函数f2()
定义和所有虚拟,您现在可以假设"孙子:: f2"在任何情况下都被召唤。如果你省略了"虚拟"在父级中,您将调用不同的函数,具体取决于您用于访问实例的指针。
因此。这对什么有用?想象一下,您有一个基于模板的集合,并希望将子项放在定义为父类型集合list<Parent*>
的集合中。如果现在调用从列表中获取的元素上的函数,则可以期望调用子函数(定义)!如果省略&#34;虚拟&#34; f2()
定义中的关键字将调用parent函数,在大多数情况下这可能是意外/不期望的。
还好吗? : - )