2012-02-16 9 views
10

prega di dare un'occhiata al seguente esempio:Come dichiarare il costruttore di copie nella classe derivata, senza il costrutto predefinito nella 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; } 
}; 

Questo codice mi tiene gettare un errore che non ci sono contructor di default per classe di base. Quando lo dichiaro tutto è ok. Ma quando non lo faccio, il codice non funziona.

Come posso dichiarare un costruttore di copia nella classe derivata senza dichiarare contructor predefinito nella classe di base?

Thnaks.

+2

Il compilatore non fornisce il costruttore predefinito per la classe una volta che abbiamo un costruttore parametrizzato. – aProgrammer

risposta

14

Chiamare il costruttore di copia (che viene generato dal compilatore) della base:

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

e, idealmente, si dovrebbe chiamare il compilatore generatore di copia generato della base. Non pensare di chiamare l'altro costruttore. Penso che sarebbe una cattiva idea.

+0

'Base (Base)' non è definito – amit

+1

@amit: 'Base (Base const &)' sarà generato dal compilatore! – Nawaz

+1

Grazie, completamente dimenticato. la tua modifica lo chiarisce. +1. – amit

4

si può (e dovrebbe) chiamare il ctor copia della classe base, come:

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

Si noti che ho girato il parametro di base in un parametro derivato, dal momento che solo che si chiama una copia ctor. Ma forse tu non voleva davvero un ctor copia ...

+1

'Base (Base const &)' è. Dal compilatore. –

+0

@amit: certo che lo è. a meno che non siate voi stessi a definire un copy ctor, il compilatore ne sintetizzerà uno per voi. – PlasmaHH

+0

@PlasmaHH: Si dovrebbe esplicitamente menzionare nella sua risposta, ho completamente dimenticato a questo proposito: \ – amit

Problemi correlati