Search code examples
c++multiple-inheritance

Why is constructor of a grand parent deleted in this case?


The compiler is complaining the constructor of D is deleted because of ill forming why ?

#include<iostream>
using namespace std;

class A
{
   int x;
   public:
   A(int i) { x = i; }
   void print() { cout << x; }
};

class B: virtual public A
{
   public:
      B():A(10) { }
};

class C: virtual public A 
{
   public:
      C():A(10) { }
};

class D: public B, public C {
};

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

Output

main.cpp:37:4: error: use of deleted function 'D::D()' D d; ^ main.cpp:32:7: note: 'D::D()' is implicitly deleted because the default definition would be ill-formed: class D: public B, public C { ^


Solution

  • Due to the rules for initialization of virtual base classes,

    class D: public B, public C {
    };
    

    is equivalent to:

    class D: public B, public C {
        public:
           D() : A(), B(), C() {}
    };
    

    That's why you cannot create in instance of D.

    Solution 1

    Change A so it has a default constructor.

    class A
    {
         int x;
       public:
         A(int i = 0) { x = i; }
         void print() { cout << x; }
    };
    

    Solution 2

    Change D to:

    class D: public B, public C {
        public:
           D() : A(0), B(), C() {}
    };
    

    or a simpler version,

    class D: public B, public C {
        public:
           D() : A(0) {}
    };