ery*_*ydo 25 c++ methods coding-style virtual-functions
我一直在与我的同事讨论是否使用virtual关键字为重写方法添加前缀,或者仅在原始基类中添加前缀.
我倾向于使用virtual关键字为所有虚拟方法(即涉及vtable查找的方法)添加前缀.我的理由是三重的:
鉴于C++缺少override关键字,virtual关键字的存在至少会通知您该方法涉及查找,理论上可以通过进一步的特化来覆盖,或者可以通过指向更高基类的指针来调用.
始终使用这种风格意味着,当你没有virtual关键字看到(在我们的代码至少)的方法,你可以初步认为它既不是从基础衍生也不专门的子类.
如果,通过一些错误,虚拟从IFoo中删除,所有子节点仍将起作用(CFooSpecialization :: DoBar仍会覆盖CFooBase :: DoBar,而不是简单地隐藏它).
正如我所理解的那样,反对这种做法的论点是,"但这种方法不是虚拟的"(我认为这种方法无效,并且来自对虚拟性的误解),并且"当我看到虚拟关键字时,我希望意味着有人从中衍生出来,然后去寻找它们."
假设的类可以分布在几个文件中,并且有几个专门化.
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
};
Run Code Online (Sandbox Code Playgroud)
从风格上讲,你会从两个派生类中删除虚拟关键字吗?如果是这样,为什么?Stack Overflow的想法是什么?
一个虚拟的函数永远是虚拟的.
因此,在任何情况下,如果虚拟关键字未在后续类中使用,则不会阻止函数/方法"虚拟",即被覆盖.所以我参与的其中一个项目有以下指南,我有点喜欢:
/*virtual*/ void guiFocusEvent();
C++ 11,使用'final'关键字和'override'Ex:void guiFocusEvent() override final;