title: C++: For a class that inherited multiple classes, how to inherit certain attributes from one class and others from the other?
body: <p>Can someone help me understand how a class that inherits from multiple classes can retain certain attribute values from one class and other certain attribute values from another.</p>
  
  <p><em>(and how would one do so for certain functions as well)</em></p>
  
  <hr>
  
  <p>Here is a bit of code to describe the problem.</p>
  
  <p>It's a situation where there is a diamond inheritance structure:</p>
  
  <hr>
  
  <p>------------- Base</p>
  
  <p>----------/---------------\</p>
  
  <p>-------/--------------------\</p>
  
  <p>--- Mother-------------Father</p>
  
  <p>---\ -----------------------/</p>
  
  <p>------\ ------------------/</p>
  
  <p>---------\ -------------/</p>
  
  <p>------------ Child</p>
  
  <hr>
  
  <p>The goal is to inherit from both the <code>Father</code> class &amp; the <code>Mother</code> class (&amp; evidently from the <code>Base</code> class) but to retain the <code>y</code> value of the <code>Father</code> and the <code>z</code> value from the <code>Mother</code>. I just don't know how to do that.</p>
  
  <p>I believe that the problem with the following code is that the order in which the constructors are called make it so that the <code>Father</code> constructor overwrites the <code>z</code> value that the <code>Mother</code> constructor right before it initialized.</p>
  
  <p>I'm thinking that I might have to make a special <code>private</code>/<code>protected</code> <code>Father</code> constructor that doesn't initialize the <code>z</code> and a special <code>private</code>/<code>protected</code> <code>Mother</code> constructor that doesn't initialize the <code>y</code> and explicitly call those constructors.</p>
  
  <p>But idk if that's the right way of doing it or if there's a better way. Does anyone know a better way ?</p>
  
  <hr>
  
  <pre><code>#include &lt;iostream&gt;
  
  class Base {
  
      protected:
  
          int x;
          int y;
          int z;
  
      public:
  
          Base(void) : x(0) {}
  
  };
  
  /* — — — — — — — — — — — — — — — — — — — —  */
  
  class Father
      : public virtual Base {
  
      public:
  
          Father(void) : Base() {
              y = 1;
              z = 1;
          }
  };
  
  /* — — — — — — — — — — — — — — — — — — — —  */
  
  class Mother
      : public virtual Base {
  
      public:
  
          Mother(void) : Base() {
              y = 2;
              z = 2;
          }
  };
  
  /* — — — — — — — — — — — — — — — — — — — —  */
  
  class Child
      : public Mother, public Father {
  
      public:
  
          Child(void) : Base() {
  
              y = Father::y;
              z = Mother::z;
          }
  
          int getX() { return x; };
          int getY() { return y; };
          int getZ() { return z; };
  };
  
  /* — — — — — — — — — — — — — — — — — — — —  */
  
  int main() {
  
      Child newborn;
  
      std::cout &lt;&lt; newborn.getX() &lt;&lt; std::endl
                &lt;&lt; newborn.getY() &lt;&lt; std::endl
                &lt;&lt; newborn.getZ() &lt;&lt; std::endl;
  
      return (0);
  }
  
  /* — — — — — — — — — — — — — — — — — — — —  */
  
  </code></pre>
  
  <hr>
  
  <pre><code>Output:
  
  0
  1
  1
  
  ——— VS ———
  
  Desired Output:
  
  0
  1
  2
  </code></pre>