2012-02-16 17 views
10

Proszę spojrzeć na poniższy przykład:Jak zadeklarować konstruktor kopiowania w klasie pochodnej, bez domyślnego konstruktora w bazie?

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; } 
}; 

Kod ten utrzymuje rzucanie mi błąd, że nie ma domyślnego contructor dla klasy bazowej. Kiedy deklaruję, wszystko jest w porządku. Ale kiedy nie, kod nie działa.

Jak mogę zadeklarować konstruktor kopii w klasie pochodnej bez deklarowania domyślnego contructor w klasie bazowej?

Thnaks.

+2

Kompilator nie dostarcza domyślnego konstruktora klasy po skonstruowaniu sparametryzowanego konstruktora. – aProgrammer

Odpowiedz

14

połączeń kopia-konstruktor (który jest generowany przez kompilator) podstawy:

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

i idealnie, należy zadzwonić kompilator wygenerowany copy-konstruktor bazy. Nie myśl o wywołaniu drugiego konstruktora. Myślę, że to byłby zły pomysł.

+0

'Base (Base)' nie jest zdefiniowany – amit

+1

@amit: 'Base (Base const &)' zostanie wygenerowany przez kompilator! – Nawaz

+1

Dzięki, zupełnie o tym zapomniałem. Twoja edycja to wyjaśnia. +1. – amit

4

można (i należy) wywołać konstruktor kopia klasy podstawowej, jak:

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

pamiętać, że zamienił parametr podstawowy do uzyskanego parametru, ponieważ tylko, że nazywa się kopia konstruktor. Ale może tak naprawdę nie chciał kopiowania konstruktor ...

+1

'Base (Base const &)' jest. Przez kompilator. –

+0

@amit: oczywiście, że tak. chyba że sam zdefiniujesz kopię, kompilator zsyntetyzuje jeden dla ciebie. – PlasmaHH

+0

@PlasmaHH: Powinieneś wyraźnie wspomnieć o tym w swojej odpowiedzi, zupełnie o tym zapomniałem: \ – amit

Powiązane problemy