我有基于另一个的界面:
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
是否正确?
答案 0 :(得分:4)
我会怀疑你确实需要/想要多重继承。我认为它只在有限的情况下很好,而接口就是其中之一(甚至Java允许这样做)。
如上所述,使用虚拟继承并确保仅在接口virtual
es中使用纯class
方法。
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*/}
};
答案 1 :(得分:3)
这在很大程度上取决于课程内部的逻辑,但IMO最好不要使用作文:
class ExtendedDrawableImplementation : public IExtendedDrawable
{
IDrawable* drawableImplementation; //points to a DrawableImplementation
public:
virtual ~ExtendedDrawableImplementation();
};
多重继承很少是答案。
答案 2 :(得分:1)
只需从ExtendedDrawableImplementation
派生IExtendedDrawable
。这样它无论如何都会有两个接口。我不明白为什么你想从这里得到两个。
答案 3 :(得分:0)
我不是C ++程序员,但从我记忆中来看,这是正确的。您没有IDrawable两次,但您有多个路径。见http://en.wikipedia.org/wiki/Diamond_problem#The_diamond_problem