C++多态/继承问题: Redefinition of base functions vs virtual functions

标签 c++ inheritance virtual-functions

我知道派生类可以简单地“重新定义”基类成员 函数,并且当派生类对象的函数是 被调用,派生类中定义的函数被使用,但是...... 这不会使“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/

相关文章:

c++ - 重载插入<<运算符

c++ - 查找 vector 中变量之间的百分比差异 C++

C# 基类和 2 个派生类初始化

java - 从外部类继承内部类与其他内部类

C++生态系统模拟器(继承)

c++ - 如何实时切换Qt5 Controls QML样式

C++ 虚函数调用与 boost::function 调用的速度对比

boost::scoped_ptr 的 C++ 析构函数问题

c++ - 为什么覆盖虚函数时不考虑访问限定符?

c++ - 如何将 REG_MULTI_SZ 值写入注册表?