多继承层次结构

时间:2009-06-18 02:48:03

标签: c++ multiple-inheritance

我很长时间以来都在寻找干净利落的方式。在我的问题中,有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();
}

在这个问题中,“独立”类型的对象由我无法更改的库提供。我想定义一个基类,它使用稍后将继承的方法。我找不到使用虚拟继承执行此操作的正确方法,而不会导致模糊编译。

1 个答案:

答案 0 :(得分:5)

你在那里遇到了一个令人讨厌的情况。对此的一个解决方案是使用奇怪的重复模板模式在编译时执行继承,如下所示:

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的班级,而且只是'don'我想为每个班级做这个。)

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();
}
相关问题