使用继承扩展接口

时间:2012-06-26 09:32:20

标签: c++

class IA
{
public:
    virtual void a() = 0;
};

class A: public IA
{
public:
    virtual void a()
    {
    }
};

class IB
{
public:
    virtual void b() = 0;
};

class B: public IB, public A
{
public:
    virtual void b()
    {
    }
};

void f(IA* p)
{

}

int main() 
{
    B b = B();
    IB* p = &b;
    f(p);
}

这是在C ++中实现具有继承的接口的正确方法吗?如果是这样,我如何在代码中获取行f(p);进行编译?基本上,我希望如果IB可以继承IA,但这会导致B出现问题。

更新

我希望IB包含IA的界面,如下所示。但是,由于IA::a()A::a()相互冲突,因此此代码无法编译。我该怎么办?

class IA
{
public:
    virtual void a() = 0;
};

class A: public IA
{
public:
    virtual void a()
    {
    }
};

class IB : public IA
{
public:
    virtual void b() = 0;
};

class B: public IB, public A
{
public:
    virtual void b()
    {
    }
};

更新2

这个编译,看起来是否正确?我是否需要所有这些虚拟

class IA
{
public:
    virtual void a() = 0;
};

class A: virtual public IA
{
public:
    virtual void a()
    {
    }
};

class IB: virtual public IA
{
public:
    virtual void b() = 0;
};

class B: virtual public IB, public A
{
public:
    virtual void b()
    {
    }
};

1 个答案:

答案 0 :(得分:5)

嗯,这当然是正确的方法,但是行f(p)不应该按原样编译,想象实现IB的类,但不实现IA,这是可能的,所以你不能假设他们都实现了IA。如果你想假设,你可以从IB继承IA,但这是另一种设计。它可以像这样实现:

class IA
{
public:
    virtual void a() = 0;
};

class A: virtual public IA
{
public:
    virtual void a()
    {
    }
};

class IB : virtual public IA
{
public:
    virtual void b() = 0;
};

class B: public IB, public A
{
public:
    virtual void b()
    {
    }
};