2012-02-16 20 views
10

favor, eche un vistazo en el siguiente ejemplo:¿Cómo declarar el constructor de copia en la clase derivada, sin construcor predeterminado en la base?

class Base 
{ 
protected: 
    int m_nValue; 

public: 
    Base(int nValue) 
     : m_nValue(nValue) 
    { 
    } 

    const char* GetName() { return "Base"; } 
    int GetValue() { return m_nValue; } 
}; 

class Derived: public Base 
{ 
public: 
    Derived(int nValue) 
     : Base(nValue) 
    { 
    } 
    Derived(const Base &d){ 
     std::cout << "copy constructor\n"; 
    } 

    const char* GetName() { return "Derived"; } 
    int GetValueDoubled() { return m_nValue * 2; } 
}; 

Este código me mantiene lanzando un error que no hay contructor por defecto para la clase base. Cuando declaro que todo está bien. Pero cuando no lo hago, el código no funciona.

¿Cómo puedo declarar un constructor de copia en la clase derivada sin declarar el contructor predeterminado en la clase base?

Thnaks.

+2

El compilador no proporciona el constructor predeterminado para la clase una vez que tenemos cualquier constructor parametrizado .. – aProgrammer

Respuesta

14

Llame al constructor de copia (que es generado por el compilador) de la base:

Derived(const Derived &d) : Base(d) 
{   //^^^^^^^ change this to Derived. Your code is using Base 
    std::cout << "copy constructor\n"; 
} 

e idealmente, debe llamar al compilador Generador de copia-constructor de la base. No pienses en llamar al otro constructor. Creo que sería una mala idea.

+0

'Base (Base)' no está definido – amit

+1

@amit: 'Base (Const base &)' será generado por el compilador! – Nawaz

+1

Gracias, lo olvidé por completo. tu edición lo aclara. +1. – amit

4

Usted puede (y debe) llamar al ctor copia de la clase base, como:

Derived(const Derived &d) : 
     Base(d) 
{ 
    std::cout << "copy constructor\n"; 
} 

Tenga en cuenta que di vuelta a la Base parámetro en un parámetro derivado, ya que sólo lo que se llama una copia ctor. Pero tal vez usted realmente no quería una copia ctor ...

+1

'Base (Const base &)' es. Por el compilador –

+0

@amit: por supuesto que lo es. a menos que defina usted mismo un códec de copia, el compilador sintetizará uno para usted. – PlasmaHH

+0

@PlasmaHH: Debería mencionarlo explícitamente en su respuesta, lo olvidé por completo: \ – amit

Cuestiones relacionadas