使用继承扩展接口

Extending interfaces using inheritance

本文关键字:接口 扩展 继承      更新时间:2023-10-16
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()
    {
    }
};

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

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()
    {
    }
};