我一直在与我的同事讨论是否使用 virtual 关键字作为覆盖方法的前缀,或者仅在原始基类中添加前缀。
我倾向于在所有虚拟方法(即涉及 vtable 查找的方法)前面加上 virtual 关键字。我的理由有三个:
鉴于 C++ 缺少 override 关键字,virtual 关键字的存在至少通知您该方法涉及查找并且理论上可以被进一步的特化覆盖,或者可以通过指向更高基类的指针来调用。
始终使用这种风格意味着,当您看到一个没有 virtual 关键字的方法(至少在我们的代码中)时,您最初可以假设它既不是从基类派生的,也不是专门用于子类的。
如果由于某些错误,从 IFoo 中删除了 virtual,所有子级仍将起作用(CFooSpecialization::DoBar 仍将覆盖 CFooBase::DoBar,而不是简单地隐藏它)。
据我了解,反对这种做法的论点是,“但该方法不是虚拟的”(我认为这是无效的,并且源于对虚拟性的误解),以及“当我看到 virtual 关键字时,我希望意味着有人从中派生,然后去寻找他们。”
假设的类可能分布在多个文件中,并且有几个专业化。
class IFoo {
public:
virtual void DoBar() = 0;
void DoBaz();
};
class CFooBase : public IFoo {
public:
virtual void DoBar(); // Default implementation
void DoZap();
};
class CFooSpecialization : public CFooBase {
public:
virtual void DoBar(); // Specialized implementation
};
从风格上讲,您会从两个派生类中删除 virtual 关键字吗?如果是这样,为什么?Stack Overflow 的想法是什么?