在 C++ 中将私有方法设为虚拟有什么好处?
我在一个开源 C++ 项目中注意到了这一点:
class HTMLDocument : public Document, public CachedResourceClient {
private:
virtual bool childAllowed(Node*);
virtual PassRefPtr<Element> createElement(const AtomicString& tagName, ExceptionCode&);
};
原文由 silverburgh 发布,翻译遵循 CC BY-SA 4.0 许可协议
尽管所有的调用都将虚拟成员声明为私有,但这个论点根本站不住脚。通常,派生类对虚函数的覆盖将不得不调用基类版本。如果声明为
private
则不能:您 必须 声明基类方法
protected
。然后,您必须采取丑陋的权宜之计,通过注释指示该方法应该被覆盖但不被调用。
因此 Herb Sutter 的指导方针 #3……但无论如何,这匹马已经离开了谷仓。
当您声明某事
protected
您隐含地信任任何派生类的编写者能够理解并正确使用受保护的内部结构,就像friend
声明意味着更深的信任private
成员。违反这种信任而导致不良行为的用户(例如,由于不费心阅读您的文档而被标记为“无知”)只能责怪他们自己。
更新:我收到了一些反馈,声称您可以使用私有虚拟函数以这种方式“链接”虚拟函数实现。如果是这样,我肯定想看看。
我使用的 C++ 编译器绝对不会让派生类实现调用私有基类实现。
如果 C++ 委员会放宽“私有”以允许这种特定访问,我将全力支持私有虚拟功能。就目前而言,我们仍然被建议在马被盗后锁上谷仓的门。