我了解虚拟方法允许派生类覆盖从基类继承的方法。什么时候使用虚拟方法合适/不合适?并不总是知道一个类是否会被子分类。一切都应该虚拟化,以防万一吗?还是会导致大量开销?
最佳答案
首先有点迂腐的评论 - 在 C++ 标准中,我们称它们为成员函数,而不是方法,尽管这两个术语是等价的。
我看到了两个不将成员函数设为虚拟的原因。
- “YAGNI”-“你不需要它”。如果您不确定一个类会派生自哪个类,假设它不会是并且不要将成员函数设为虚拟。顺便说一句,没有什么比非虚拟析构函数更能说明“不要从我那里派生”(编辑:在 C++11 及更高版本中,您有
final
关键字],它甚至更好)。这也与意图有关。如果您不打算以多态方式使用该类,请不要将任何东西设为虚拟。如果您任意将成员设为虚拟,您就是在邀请 Liskov Substitution Principle 的滥用。这类错误很难追踪和解决。 - 性能/内存占用。没有虚拟成员函数的类不需要 VTable(虚拟表,用于通过基类指针重定向多态调用),因此(可能)占用更少的内存空间。此外,直接成员函数调用(可能)比虚拟成员函数调用更快。 不要通过先发制人地将成员函数设为虚拟来过早地悲观您的类。
关于c++ - 什么时候适合使用虚方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6059260/