我知道派生类可以简单地“重新定义”基类成员 函数,并且当派生类对象的函数是 被调用,派生类中定义的函数被使用,但是...... 这不会使“virtual”关键字变得多余吗?我读过 这两种情况之间存在一些明显的显着差异(即:如果 你有一个指向派生类的基类指针,你调用 一个函数,如果它是虚拟的,则派生类函数将是 调用,但如果不调用,将调用基类函数)。
换句话说,能够重新定义成员的目的是什么 用作非虚拟函数,这是一个常用的 练习?
就我个人而言,这似乎会变得非常困惑。
谢谢!
最佳答案
对于最常见的 OOP 语言(Java、SmallTalk、Python 等),最常见的方法是默认将每个成员函数都设置为虚拟
。
缺点是每次进行虚拟调用时都会有小的性能损失。因此,C++ 允许您选择是否要将方法定义为虚拟方法。
但是,虚方法和非虚方法之间有一个非常重要的区别。例如:
class SomeClass { ... };
class SomeSubclassOfSomeClass : public SomeClass { ... };
class AnotherSubclassOfSomeClass : public SomeClass { ... };
SomeClass* p = ...;
p->someVirtualMethod();
p->someNonVirtualMethod();
调用someVirtualMethod
时实际执行的代码取决于引用指针p
的具体类型,完全取决于SomeClass
子类重新定义。
但是在 someNonVirtualMethod
调用上执行的代码很清楚:总是在 SomeClass
上执行,因为 p 变量的类型是 SomeClass
.
关于C++多态/继承问题: Redefinition of base functions vs virtual functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4882105/