6
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

2 回答 2

3

在分离接口和实现层次结构时,将多重继承虚拟继承结合使用是一种合适的设计选择。例如,参见:“什么时候虚拟继承是一个好的设计?


优点:

  • 更少的代码重复:接口实现可重用
  • 在类的接口实现之间切换很容易
  • 只看基类就可以了解很多关于具体实现的信息

缺点:

  • 虚拟继承对调度性能的影响
  • 不常见的模式,需要为外部/新人解释/记录

备择方案:

  • 如果需要接口层次结构,则没有好的选择

  • 否则,层次结构可以分解为单独的接口

它可能看起来像:

struct IA
{
    virtual ~IA() = default;
    virtual void a() = 0;
};

struct A: public IA
{
    virtual ~A() = default;
    virtual void a() {}
};

struct IB
{
    virtual ~IB() = default;
    virtual void b() = 0;
};

struct B: public IB
{
    virtual ~B() = default;
    virtual void b() {}
};

struct C: public A, public B
{
};
于 2016-12-29T10:11:43.190 回答
2

There is one relatively clean workaround. When you inherit B from IB, the compiler requires your provide an implementation of all abstract methods from IB including IA. As a() is already implemented in A, you can create a stub in B that simply invokes a method from 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()
    {
    }

    virtual void a()
    {
        A::a();
    }
};
于 2012-06-26T13:07:37.613 回答