2

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

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

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();
}

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

4

1 回答 1

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(我假设您有许多类派生自同一个Baseand Independent,只是不想为每个类都这样做)。

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();
}
于 2009-06-18T03:16:11.127 回答