【问题标题】:Virtual inheritance and interfaces虚拟继承和接口
【发布时间】:2012-06-26 10:20:39
【问题描述】:
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()
    {
    }
};

你总是像我上面那样继承你的虚拟接口吗?如果没有,您将如何实现上述代码?

【问题讨论】:

  • 看看this
  • 如果层次结构必须是这样,那么虚拟继承是唯一的选择,但在大多数情况下,在 C++ 中,您最终不会采用这种类型的设计。我在职业生涯中使用虚拟继承的情况很少......
  • 这种设计会发生,但希望很少。在任何情况下,都必须事先考虑好,并权衡其他可能性,因为有时您不能只将virtual 添加到第三方代码中。
  • @David Rodríguez 但是如果我在接口之间使用继承,那么我将不得不使用虚拟继承,就像上面的例子一样,对吧?我有哪些设计替代方案?

标签: c++ virtual-inheritance


【解决方案1】:

在分离接口和实现层次结构时,将多重继承虚拟继承结合使用是一种合适的设计选择。例如,参见: "When virtual inheritance IS a good design?"


优点:

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

缺点:

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

替代方案:

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

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

它可能看起来像:

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

【讨论】:

    【解决方案2】:

    有一个相对干净的解决方法。当您从 IB 继承 B 时,编译器要求您提供所有来自 IB 的抽象方法的实现,包括 IA .由于 A 中已经实现了 a(),因此您可以在 B 中创建一个存根,该存根仅调用来自 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();
        }
    };
    

    【讨论】:

    • 只要您不想经常将B 实例传递给采用IA& 的函数...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2013-08-24
    相关资源
    最近更新 更多