我可以部分实现接口层次结构吗?

时间:2013-12-18 14:40:07

标签: c++ inheritance abstract-class

我正在编写类似于此的界面:

class BaseInterface
{
    virtual void MethodA() = 0;
}

class DerivedInterface : public BaseInterface
{
    virtual void MethodB() = 0;
}

我想创建一个类Derived,它是一个DerivedInterface(隐含地,是一个BaseInterface,特别是Base。也就是说,我只想在类MethodB中定义Derived - 我想在其他地方部分指定接口(即MethodA)。

class Base : public BaseInterface
{
    virtual void MethodA() {...};
}

class Derived : public DerivedInterface // somehow include Base as well
{
    void MethodB() {...};
}

这在C ++中是否可行?

2 个答案:

答案 0 :(得分:1)

使用虚拟继承,以避免成员重复:

class BaseInterface
{
    public:
    virtual void MethodA() = 0;
};

class DerivedInterface : virtual public BaseInterface
{
    public:
    virtual void MethodB() = 0;
};

class Base : virtual public BaseInterface
{
    public:
    virtual ~Base() {}
    virtual void MethodA() {};
};

class Derived : public Base, virtual public DerivedInterface
{
    public:
    virtual void MethodB() {};
};

int main() {
    Derived d;
    d.MethodA();
    d.MethodB();
}

没有虚拟继承Derived有两个MethodA,需要在Derived中有一个额外的覆盖:

virtual void MethodA() override { Base::MethodA(); }

但这会破坏界面设计!

没有派生接口可能更清晰:

class FirstInterface;
class SecondInterface;
class Base : public virtual FirstInterface;
class Derived : public Base, virtual public SecondInterface;

即使没有虚拟继承,也可以避免重复。 (为避免出现问题,我也会使用虚拟接口继承)

答案 1 :(得分:0)

多重继承是它的完美答案。

class Derived : public Base, virtual public DerivedInterface
{
    public:
    virtual void MethodB() {};
};

现在你有两个成员......