5

我有基于另一个接口:

class IDrawable {
public:
   virtual ~IDrawable();
};

class IExtendedDrawable: public IDrawable {
public:
   virtual ~IExtendedDrawable();
};

class DrawableImplementation: public IDrawable {
public:
   virtual ~DrawableImplementation();
};

class ExtendedDrawableImplementation: 
   public DrawableImplementation, public IExtendedDrawable
{
public:
   virtual ~ExtendedDrawableImplementation();
};

然后ExtendedDrawableImplementation= DrawableImplementation (+IDrawable)+IExtendedDrawable (+IDrawable)

IDrawable同一班有两次是正确的吗?

4

4 回答 4

5

我会怀疑你确实需要/想要多重继承。我认为它仅在有限的情况下是好的,接口就是其中之一(甚至 Java 也允许这样做)。

如上所述,使用虚拟继承,并确保virtual在接口classes 中只使用纯方法。

class IDrawable {
public:
   virtual ~IDrawable();
   virtual void doSomething() = 0;
};

class IExtendedDrawable: virtual public IDrawable {
public:
   virtual ~IExtendedDrawable();
   virtual void doSomethingElse() = 0;
};

class DrawableImplementation: virtual public IDrawable {
public:
   virtual ~DrawableImplementation();
   virtual void doSomething() {/*code here*/}
};

class ExtendedDrawableImplementation: 
   public DrawableImplementation, public IExtendedDrawable
{
public:
   virtual ~ExtendedDrawableImplementation();
   virtual void doSomething() {/*code here*/}
   virtual void doSomethingElse() {/*code here*/}
};
于 2012-08-21T19:47:31.743 回答
3

这在很大程度上取决于类内部的逻辑,但是 IMO 你最好使用组合来代替:

class ExtendedDrawableImplementation : public IExtendedDrawable
{
   IDrawable* drawableImplementation; //points to a DrawableImplementation
public:
   virtual ~ExtendedDrawableImplementation();
};

多重继承很少是答案。

于 2012-08-21T19:32:36.833 回答
1

只是ExtendedDrawableImplementationIExtendedDrawable. 这样它无论如何都会有两个接口。我不明白你为什么要从这里得到两者。

于 2012-08-21T19:51:58.150 回答
0

我不是 C++ 程序员,但据我记得,这是正确的。你没有 IDrawable 两次,但你有多个路径。见http://en.wikipedia.org/wiki/Diamond_problem#The_diamond_problem

于 2012-08-21T19:33:47.230 回答