title: Do you need to call virtual base class constructor from all derived classes? Even if they're not the most derived?
body: <p>I am having trouble with multiple inheritance and the diamond problem. </p>
  
  <p>The problem occurs because my base class constructor requires a parameter. The compiler tries to generate a default constructor for my two abstract classes, but that fails because the default constructor cannot determine the parameter for the base class.</p>
  
  <p>I don't understand why my abstract classes are calling the base constructor. I thought the most derived class is the one that calls the virtual base class constructor.</p>
  
  <p>Here is code that reproduces what I'm talking about:</p>
  
  <pre><code>class VirtualBase
  {
  
          public:
  
                  VirtualBase(int initial) :
                          count(initial)
          {}
  
                  int getCount() const
                  {
                          return count;
                  }
  
                  void increment()
                  {
                          count++;
                  }
  
          private:
  
                  int count;
  
  };
  
  
  class ContractA : public virtual VirtualBase
  {
  
          public:
  
                  virtual void doSomething() = 0;
  
  };
  
  class ContractB : public virtual VirtualBase
  {
  
          public:
  
                  virtual void doSomethingElse() = 0;
  
  };
  
  class Concrete : public ContractA, public ContractB
  {
  
          public:
  
                  Concrete() : 
                          VirtualBase(0)
          {}
  
                  virtual void doSomething()
                  {
                           increment();
                  }
  
                  virtual void doSomethingElse()
                  {
                          // etc...       
                  }
  
  };
  
  int main()
  {
  
          Concrete concrete;
          concrete.doSomething();
          concrete.doSomethingElse();
          return 0;
  }
  </code></pre>
  
  <p>I get the following error (for each Contract):</p>
  
  <pre><code>main.cpp: In constructor ‘ContractA::ContractA()’:
  main.cpp:29:7: error: no matching function for call to ‘VirtualBase::VirtualBase()’
   class ContractA : public virtual VirtualBase
         ^
  main.cpp:29:7: note: candidates are:
  main.cpp:9:3: note: VirtualBase::VirtualBase(int)
     VirtualBase(int initial) :
     ^
  main.cpp:9:3: note:   candidate expects 1 argument, 0 provided
  main.cpp:4:7: note: VirtualBase::VirtualBase(const VirtualBase&amp;)
   class VirtualBase
         ^
  main.cpp:4:7: note:   candidate expects 1 argument, 0 provided
  main.cpp: In constructor ‘Concrete::Concrete()’:
  main.cpp:53:17: note: synthesized method ‘ContractA::ContractA()’ first required here 
      VirtualBase(0)
                   ^
  </code></pre>