title: Why aren't copy constructors "chained" like default constructors and destructors?
body: <p>Why aren't copy constructors chained (like default ctors or dtors) so that before the derived class's copy constructor is called, the base class's copy constructor is called? With default constructors and destructors, they are called in a chain from base-to-derived and derived-to-base, respectively. Why isn't this the case for copy constructors? For example, this code:</p>
  
  <pre><code>class Base {
  public:
      Base() : basedata(rand()) { }
  
      Base(const Base&amp; src) : basedata(src.basedata) {
          cout &lt;&lt; "Base::Base(const Base&amp;)" &lt;&lt; endl;
      }
  
      void printdata() {
          cout &lt;&lt; basedata &lt;&lt; endl;
      }
  
  private:
      int basedata;
  };
  
  class Derived : public Base {
  public:
      Derived() { }
  
      Derived(const Derived&amp; d) {
          cout &lt;&lt; "Derived::Derived(const Derived&amp;)" &lt;&lt; endl;
      }
  };
  
  
  srand(time(0));
  
  
  Derived d1;      // basedata is initialised to rand() thanks to Base::Base()
  
  d1.printdata();  // prints the random number
  
  Derived d2 = d1; // basedata is initialised to rand() again from Base::Base()
                   // Derived::Derived(const Derived&amp;) is called but not
                   // Base::Base(const Base&amp;)
  
  d2.printdata();  // prints a different random number
  </code></pre>
  
  <p>The copy constructor doesn't (can't) really make a copy of the object because <code>Derived::Derived(const Derived&amp;)</code> can't access <code>basedata</code> to change it.</p>
  
  <p>Is there something fundamental I'm missing about copy constructors so that my mental model is incorrect, or is there some arcane (or not arcane) reason for this design?</p>