我倾向于给所有虚拟方法(即涉及vtable查找的方法)都加上virtual关键字。我的理由有三个:
1. 由于C++缺乏一个override关键字,virtual关键字的存在至少会通知你该方法涉及查找,并且理论上可以被进一步专门化覆盖,或者可以通过指向更高基类的指针调用。
2. 始终使用这种风格意味着,当你看到一个没有virtual关键字的方法时(至少在我们的代码中),你可以最初假定它既不是从一个基类派生出来的,也没有在子类中专门化。
3. 如果出现错误,将virtual从IFoo中删除,则所有子项仍将正常运行(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在这方面有什么想法?
Stylistically, would you remove the virtual keyword from the two derived classes? If so, why? What are Stack Overflow's thoughts here?
override
修饰符来标明一个函数是虚函数并重写另一个函数;这样做也使编译器能够在该函数不覆盖任何东西时给出错误消息。对于您的示例,CFooBase
和CFooSpecialization
将具有virtual void DoBar() override;
。 - Justin Time - Reinstate Monicag++
的技巧:https://dev59.com/MF4b5IYBdhLWcg3wbRIf - underscore_d