12

Given the following code (without virtual inheritance) :

class A
{
public:
    virtual void f() = 0;
};

class B : public A
{
 public:
    virtual void f() {}
};

class C : public A
{
 public:
    virtual void f() {}
};

class D : public B, public C
{

/* some code */
};


int main()
{
    D d;
    return 0;
}

the code compile.

On the other hand , here :

class A
{
public:
    virtual void f() = 0;
};

class B : virtual public A
{
    virtual void f() {}
};

class C : virtual public A
{
    virtual void f() {}
};

class D : public B, public C
{
    /* some code */
};


int main()
{
    D d;
    return 0;
}

The compiler presents a compilation error:

no unique final overrider for 'virtual void A::f()' in 'D' . 

Why is it different in the second code ?

curiousguy
  • 8,038
  • 2
  • 40
  • 58
Ron_s
  • 1,429
  • 1
  • 14
  • 24
  • Does `D` implement/override `virtual void f()` or no? – ssube Aug 28 '11 at 09:07
  • Virtual inheritance is not the magical solution to the repeated inheritance issue. It is a different tool than non-virtual inheritance, much like virtual vs. non-virtual functions: they have different semantics, and are appropriate for different problems. – curiousguy Jul 21 '12 at 01:57

2 Answers2

9

Your first scenario hierarchy corresponds to:

    F()   F()
     A     A
     |     |
 F() B     C F()
      \   /
        D 

Where D is not abstract, because there are two A subobjects in an object of type D: One that is made concrete by B through the lattice of B, and another that is made concrete through the lattice of C.

Unless you try to invoke the function F() on object of D there will not be any ambiguity.

Your second scenario hierarchy corresponds to:

       F()  
        A
      /   \
 F() B     C F()
      \   /
        D  

In this scenario, the object D has a single Base class A sub object, and it must override and provide implementation of the pure virtual function in that subobject.


Herb Sutter's articles in Guru Of The Week(GOTW) are a nice read for Multiple Inheritance:

  1. Multiple Inheritance Part I
  2. Multiple Inheritance Part II
  3. Multiple Inheritance Part III
Alok Save
  • 202,538
  • 53
  • 430
  • 533
7

With the virtual inheritance a D object has a single base-class A sub-object. This single sub-object can’t have two different implementations of a virtual function. In contrast, without virtual inheritance a D object has two distinct base-class A sub-objects, each with its own implementation of the function (which is OK until you try to call it on a D object, at which point you need to indicate which one you want).

Cheers & hth.

Cheers and hth. - Alf
  • 142,714
  • 15
  • 209
  • 331