代码之家  ›  专栏  ›  技术社区  ›  Gal Goldman

虚拟继承[重复]

  •  54
  • Gal Goldman  · 技术社区  · 16 年前

    我看到了下面的代码,不理解关键字的含义 virtual

    class A {};
    class B : public virtual A;
    
    1 回复  |  直到 13 年前
        1
  •  55
  •   ShdNx    9 年前

    虚拟继承用于解决DDD问题(派生上可怕的菱形)。

    请看以下示例,其中有两个类继承自同一基类:

    class Base
    {
    
    public:
    
     virtual void  Ambig();
    
    };
    

    class C : public Base
    {
    
    public:
    
    //...
    
    };
    
    class D : public Base
    {
    public:
    
        //...
    
    };
    

    现在,您想创建一个新类,该类同时继承C类和D类(它们都继承了Base::Ambig()函数):

    class Wrong : public C, public D
    {
    
    public:
    
    ...
    
    };
    

    当您在上面定义“错误”类时,实际上创建了DDD(菱形派生问题),因为您不能调用:

    Wrong wrong;
    wrong.Ambig(); 
    

    Wrong::C::Base::Ambig()
    

    以及:

    Wrong::D::Base::Ambig()
    

    为了防止这种问题,您应该使用虚拟继承,它将知道引用的权利 Ambig() 功能。

    因此-定义:

    class C : public virtual Base
    
    class D : public virtual Base
    
    class Right : public C, public D