2009-10-01 15 views
5
class Base 
{ 
     public: 
     int i; 

     Base() 
     { 
      cout<<"Base Constructor"<<endl; 
     } 

     Base (Base& b) 
     { 
      cout<<"Base Copy Constructor"<<endl; 
      i = b.i; 
     } 


     ~Base() 
     { 
      cout<<"Base Destructor"<<endl; 
     } 

     void val() 
     { 
      cout<<"i: "<< i<<endl; 
     }  
}; 

class Derived: public Base 
{ 
     public: 
     int i; 

     Derived() 
     { 
      Base::i = 5;  
      cout<<"Derived Constructor"<<endl; 
     } 

     /*Derived (Derived& d) 
     { 
      cout<<"Derived copy Constructor"<<endl; 
      i = d.i; 
     }*/ 

     ~Derived() 
     { 
      cout<<"Derived Destructor"<<endl; 
     }  

     void val() 
     { 
      cout<<"i: "<< i<<endl; 
      Base::val(); 
     } 
}; 

Si lo hago Derivado d1; Derivado d2 = d1; Se llama al constructor de copia de base y se llama al constructor de copia predeterminado de derivada.Constructor de copia base no llamado

Pero si elimino los comentarios del constructor de copia derivado no se llama al constructor de copia base. ¿Hay alguna razón específica para esto? Gracias de antemano.

+3

IMVHO http://www.parashift.com/c++faq-lite/ctors.html es un recurso increíble para entender los constructores de C++. (Y de hecho, C++ FAQ Lite en general es una increíble fuente de información para principiantes avanzados.) – notJim

+0

Creo que el destructor base debe ser virtual. –

Respuesta

13

Si desea leer la regla real que debe referirse a C++ estándar 12.8/8:

El constructor de copia definido implícitamente para la clase X realiza una copia de sus subobjetos miembro por miembro. El orden de copiado de es el mismo que el orden de inicialización de las bases y miembros en un constructo tor definido por el usuario (consulte 12.6.2). Cada subobjeto se copia de la manera apropiada a su tipo:

  • si el subobjeto es de tipo de clase, se utiliza el constructor de copia para la clase;
  • si el subobjeto es una matriz, cada elemento se copia, de la manera apropiada para el tipo de elemento;
  • si el subobjeto es de tipo escalar, se utiliza el operador de asignación integrado.

Al definir explícitamente constructor de copia debe llamar copy c-tor de la clase base explícita.

16

Yo creo que hay que llamar explícitamente al constructor de copia de base:

Derived (Derived& d) : Base(d) 
    { 
     cout<<"Derived copy Constructor"<<endl; 
     i = d.i; 
    } 
4

En el constructor de copia Derived, es necesario agregar lo siguiente:

Derived (const Derived &d) : Base(d) { } 
2

C++ no hace ningún tipo de "coincidencia de constructor". Si no llama explícitamente al constructor de la clase base, se llama al predeterminado (bueno, técnicamente, el subobjeto de la clase base es "valor inicializado", pero para las clases con constructores esto es lo mismo).

1

debe leer this: explica cómo la herencia & miembros especiales como los constructores están trabajando.

0

Muchas gracias. Entiendo. Significa que la llamada al constructor de copia de la clase base se realiza de forma automática en el constructor de copia predeterminado del derivado. Mientras que en el segundo caso, ya que estoy escribiendo el constructor de copia derivado, debo hacer una llamada explícita al constructor de copia de la base. Gracias de nuevo

Cuestiones relacionadas