3
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 带来问题。

更新

我想要的是IBincludeIA的接口,如下。但是,此代码将无法编译,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()
    {
    }
};
4

1 回答 1

6

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

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()
    {
    }
};
于 2012-06-26T09:36:27.270 回答