c++ - 什么时候适合使用虚方法?

标签 c++ oop methods virtual

我了解虚拟方法允许派生类覆盖从基类继承的方法。什么时候使用虚拟方法合适/不合适?并不总是知道一个类是否会被子分类。一切都应该虚拟化,以防万一吗?还是会导致大量开销?

最佳答案

首先有点迂腐的评论 - 在 C++ 标准中,我们称它们为成员函数,而不是方法,尽管这两个术语是等价的。

我看到了两个不将成员函数设为虚拟的原因。

  • “YAGNI”-“你不需要它”。如果您不确定一个类会派生自哪个类,假设它不会是并且不要将成员函数设为虚拟。顺便说一句,没有什么比非虚拟析构函数更能说明“不要从我那里派生”(编辑:在 C++11 及更高版本中,您有 final 关键字],它甚至更好)。这也与意图有关。如果您不打算以多态方式使用该类,请不要将任何东西设为虚拟。如果您任意将成员设为虚拟,您就是在邀请 Liskov Substitution Principle 的滥用。这类错误很难追踪和解决。
  • 性能/内存占用。没有虚拟成员函数的类不需要 VTable(虚拟表,用于通过基类指针重定向多态调用),因此(可能)占用更少的内存空间。此外,直接成员函数调用(可能)比虚拟成员函数调用更快。 不要通过先发制人地将成员函数设为虚拟来过早地悲观您的类。

关于c++ - 什么时候适合使用虚方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6059260/

相关文章:

c++ - 复制构造函数中的无限递归

c++ - 无法在 Ubuntu 中的 Eclipse 上进行调试

swift - 如何从一个类访问另一个类的变量?

python - 在两个 wxpython 选项卡之间共享变量

c++ - 这个递归方法不应该一到return就结束了吗?

C++ 段错误

c++ - 将项目移植到 OpenGL3

java - 在线餐厅预订系统(数据结构)

java - 无法理解Java类的定义

c++ - 从 JIT 代码调用方法