在子类中重写时如何调用私有虚拟基类实现

Chaos_99

我有一个这样的类层次结构:

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();,但由于Defaultthis iss 声明而在此处失败private

显然,一种解决方案是将其从 更改privateprotected,但我想问一下是否有另一种方法?我不想让任何孩子直接调用此函数,而是将其限制为通过已在BaseorDefault类中定义的虚函数启动的调用

是否有一些选项或修饰符允许成员函数调用仅在子类位于(相同的)覆盖虚拟成员函数中时才允许?

阿空加瓜

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

即使它们是私有的,基类的好友函数如何调用派生类的重写虚拟函数?(C ++)

在 C++ 中实现复制控制时如何处理基类的私有成员?

在C ++中,公共继承基类调用派生类的私有虚拟功能

派生类中的私有重写虚拟函数

无法使用子类中定义的虚拟 getter 实现基类

如何在Java中强制调用超类实现Object.toString()而不是子类重写对对象的实现

如何从子类中调用重写的父类方法?

如何从修饰的子类方法中调用重写的超类方法

在基类中编写需要在子类中重写的方法实现?

内置类的子类的私有字段在重写方法中是否不可访问?

如何从私有基类调用静态方法?

如何决定从父类或子类中调用子类中的重写方法?

重写派生类C ++中基类私有成员的行为

如何从子类中调用基类的__init__方法?

在 Java 中,如何在不访问 Deque 类中的私有字段的情况下在 Deque 类的子类中实现新功能?

调用子重写时始终调用超类虚拟函数

从指针基抽象类调用非虚拟子类方法

在 C++ 中可以通过从私有实例化类调用方法而不重新实现它来覆盖虚拟方法吗?

如何使用私有继承的方法重写纯虚拟方法?

C ++当我不知道子类型时,从基类中调用子类函数

为什么可以在子类中调用密封类的私有构造函数?

Javascript:从基类继承方法并返回子类的私有变量

在Typescript中实现接口时如何定义私有属性?

在Python中,有什么方法可以从其父类调用子类的方法重写吗?

具有虚拟析构函数的基类的子类中的默认析构函数

如何重写子类中的方法并调用父类方法而不丢失数据

基类构造函数在Java中调用重写方法时派生类对象的状态

如何实现基类的虚方法以及如何在C#中的重写方法中获得基方法的实现

在基类重写的 ToString 方法中访问子类对象