【问题标题】:Multiple inheritance hierarchy多重继承层次结构
【发布时间】:2009-06-18 02:48:02
【问题描述】:

长期以来,我一直在寻找一种干净的方式来做到这一点。在我的问题中,存在 3 个类不共享任何父类,但每个类都有一些同名的方法(A.doSomething、B.doSomething、C.doSomething)。因此,具有相同的函数签名,从 A 继承并使用方法 doSomething() 的类 D 与从 B 或 C 继承的 E “看起来相同”。

这是我想要做的事情的草图:

class Base {
    public:
    void myMethod(void) { doSomething(); }
};

class Independent {
    public:
        doSomething();
};

clase Derived : public Base : public Independent {
 (...)
};

int main(void) {
   Derived *derivedObject = new Derived();
   derivedObject->myMethod();
}

在这个问题中,“独立”类型的对象由我无法更改的库提供。我想定义一个使用稍后将被继承的方法的基类。我找不到使用虚拟继承而不引起歧义编译的正确方法。

【问题讨论】:

  • 你能把你的问题解释清楚一点吗?我在该代码 sn-p 中只看到一个名为“doSomething”的方法,但您在描述中提到了三个具有它的类,并且您没有评论“myMethod”方法的用途。

标签: c++ multiple-inheritance


【解决方案1】:

你的情况很糟糕。对此的一种解决方案是在编译时使用 Curiously Recurring Template Pattern 来执行继承,如下所示:

template <typename D>
class Base {
    public:
        void myMethod(void) { static_cast<D*>(this)->doSomething(); }
};

class Independent {
    public:
        void doSomething();
};

clase Derived : public Base : public Independent {
    /*...*/
};

int main(void) {
   Derived *derivedObject = new Derived();
   derivedObject->myMethod();
}

或者,您可以选择在两者之间放置一个中间人类以转发到 Independent(我假设您有许多类源自相同的 BaseIndependent,只是不想这样做这适用于每个班级)。

template <typename D>
class Base {
    private:
        virtual void doSomethingImpl();
    public:
        void myMethod(void) { doSomethingImpl(); }
};

class Independent {
    public:
        void doSomething();
};

class IndependentWrapper : public Base : public Independent {
    private:
        void doSomethingImpl() { Independent::doSomething(); }
};

clase Derived : public IndependentWrapper {
    /*...*/
};

int main(void) {
   Derived *derivedObject = new Derived();
   derivedObject->myMethod();
}

【讨论】:

    猜你喜欢
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多