【发布时间】:2019-09-27 05:57:46
【问题描述】:
我有一个这样的类层次结构:
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*/};
}
如果我在 Special 类型的对象上调用 start(),这会正常工作;
现在我有一个案例,在Special 类的实现中,我想调用Default 类的实现。
通常这可以与Default::init(); 一起使用,但由于Defaults 声明这是private,所以这里会失败。
显然一种解决方案是将其从private 更改为protected,但我想问一下是否还有其他方法?我不想让任何孩子直接调用此函数,而是将其限制为通过 Base 或 Default 类中已定义的虚函数发起的调用。
是否有一些选项或修饰符允许仅允许来自子类的成员函数调用,前提是它们位于(相同的)覆盖虚拟成员函数中?
【问题讨论】:
-
我认为不,这是不可能的。这正是
protected的用法,允许从具有public继承的孩子访问 -
唯一能想到的就是把派生类做成
friend。 -
@songyuanyao 在这种情况下,我认为
friend比protected更邪恶;它将允许访问可能更多,并且需要修改基类,每个新的派生类都需要类似的访问......
标签: c++ inheritance virtual