C中的私有虚方法

新手上路,请多包涵

在 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 许可协议

阅读 414
1 个回答

尽管所有的调用都将虚拟成员声明为私有,但这个论点根本站不住脚。通常,派生类对虚函数的覆盖将不得不调用基类版本。如果声明为 private 则不能:

 class Base
{
 private:

 int m_data;

 virtual void cleanup() { /*do something*/ }

 protected:
 Base(int idata): m_data (idata) {}

 public:

 int data() const { return m_data; }
 void set_data (int ndata) { m_data = ndata; cleanup(); }
};

class Derived: public Base
{
 private:
 void cleanup() override
 {
  // do other stuff
  Base::cleanup(); // nope, can't do it
 }
 public:
 Derived (int idata): base(idata) {}
};

必须 声明基类方法 protected

然后,您必须采取丑陋的权宜之计,通过注释指示该方法应该被覆盖但不被调用。

 class Base
{
 ...
 protected:
 // chained virtual function!
 // call in your derived version but nowhere else.
 // Use set_data instead
 virtual void cleanup() { /* do something */ }
 ...

因此 Herb Sutter 的指导方针 #3……但无论如何,这匹马已经离开了谷仓。

当您声明某事 protected 您隐含地信任任何派生类的编写者能够理解并正确使用受保护的内部结构,就像 friend 声明意味着更深的信任 private 成员。

违反这种信任而导致不良行为的用户(例如,由于不费心阅读您的文档而被标记为“无知”)只能责怪他们自己。

更新:我收到了一些反馈,声称您可以使用私有虚拟函数以这种方式“链接”虚拟函数实现。如果是这样,我肯定想看看。

我使用的 C++ 编译器绝对不会让派生类实现调用私有基类实现。

如果 C++ 委员会放宽“私有”以允许这种特定访问,我将全力支持私有虚拟功能。就目前而言,我们仍然被建议在马被盗后锁上谷仓的门。

原文由 Spencer 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题