我有一个这样的类层次结构:
class Base
{
public:
void start() { init(); }
private:
virtual void init() = 0;
};
class Default : public Base
{
private:
virtual void init() override {/*default implementation*/};
};
class Special : public Default
{
private:
virtual void init() override final {/*specialized implementation*/};
}
如果我调用start()
一个类型的对象,这可以正常工作Special
;
现在我有一个案例,在Special
类的实现中我想调用Default
类的实现。通常,这将与 一起使用Default::init();
,但由于Default
this is的s 声明而在此处失败private
。
显然,一种解决方案是将其从 更改private
为protected
,但我想问一下是否有另一种方法?我不想让任何孩子直接调用此函数,而是将其限制为通过已在Base
orDefault
类中定义的虚函数启动的调用。
是否有一些选项或修饰符允许成员函数调用仅在子类位于(相同的)覆盖虚拟成员函数中时才允许?
C++ 不提供直接实现这一点的方法,因此您必须解决,例如在下面的一段代码中。
好吧,如果你绝对想要。我个人宁愿退回到保护函数,记录它们的用途和调用时间,然后只相信派生类会正确地做这些事情。这最终使界面更干净,并且不依赖于一个相当不寻常(也许是丑陋)的模式(实际上传递了this
两次)。
class Base
{
public:
virtual ~Base() { }
void start()
{
InitProxy p(*this);
init(p);
}
protected:
class InitProxy
{
public:
InitProxy(InitProxy const&) = delete;
void init()
{
m_base.Base::init(*this);
}
private:
friend class Base;
Base& m_base;
InitProxy(Base& base)
: m_base(base)
{ }
};
private:
virtual void init(InitProxy& proxy) { }
};
class Derived : public Base
{
void init(InitProxy& proxy) override
{
proxy.init();
}
};
如果您想将此约束应用于多个函数,您可以让代理接受成员函数指针,这样您就不必分别为每个函数重新编写代理。如果函数参数不同,您可能需要从那时起制作模板。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句