c++ - 在子类中重写时如何调用私有(private)虚拟基类实现

标签 c++ inheritance virtual

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

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(); 一起工作,但由于 Default 声明它是 private 而在这里会失败。

显然一个解决方案是将此从private 更改为protected,但我想问一下是否还有其他方法?我不想让任何 child 直接调用此函数,而是希望将其限制为通过已在 BaseDefault 类中定义的虚函数启动的调用。

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

最佳答案

C++ 不提供直接实现此目的的方法,因此您必须变通,例如。 G。在下面的一段代码中。

好吧,如果你绝对想要。我个人宁愿回过头来让函数受到保护,记录它们的用途和调用时间,然后只相信派生类会正确地做事。这最终使界面更简洁,并且不依赖于一种相当不寻常的(可能是丑陋的)模式(实际上传递 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();
    }
};

如果您想将此约束应用于多个函数,您可以让代理接受一个成员函数指针,这样您就不必为每个函数分别重写代理。如果函数参数不同,您可能需要从那时起制作一个模板。

关于c++ - 在子类中重写时如何调用私有(private)虚拟基类实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58128586/

相关文章:

inheritance - 在 Promise : 'super' keyword unexpected here? 中调用 super() 方法

python - Python 中是否有允许在单个文件中管理虚拟文件系统的库?

c++ - 为什么模板只能在头文件中实现?

c++ - 静态链接与动态链接

c++ - Qt : Background thread refreshing UI thread

c++ - 为什么基类枚举不被继承?

inheritance - 在 Python 中,当它是一次性命名元组时如何调用父类(super class)?

php - USB key 中的Linux测试环境(apache + php + git)?

c++ - 中级: pure virtual method called

Android NDK 编译 LAME HAVE_MPGLIB > 'interface.h' 找不到文件