代码之家  ›  专栏  ›  技术社区  ›  fizzer

C++中的纯ABC需要是虚拟的吗?

c++
  •  3
  • fizzer  · 技术社区  · 6 年前

    假设一个纯粹的抽象基类可能在一个可怕的死亡钻石中被多条路径继承。使用虚拟继承有什么好的理由吗,或者这无关紧要?

    1 回复  |  直到 6 年前
        1
  •  2
  •   lubgr    6 年前

    使用虚拟继承有很好的理由,因为编译器会强制它。考虑这个场景:

    struct A {
      virtual ~A() = default;
      virtual void f() = 0;
    };
    
    struct B : A {};
    
    struct C : A {};
    
    struct D : B, C {
       void f() override {}
    };
    

    如果没有虚拟继承,以下代码将无法编译

    D d;
    A &a = d; // error: 'A' is an ambiguous base of 'D'
    

    当你改变 B C 如此

    struct B : virtual A {};
    
    struct C : virtual A {};
    

    一切都会好起来的。