2011-10-15 2 views
5
struct A{ 
    virtual void what() { cout << "Base" << endl; }; 
}; 

struct B : A { 
    virtual void what() { cout << "Sub" << endl; }; 
    int m; 
    B() : m(10) {}; 
    B(const A & x) : m(50) {}; 
}; 

void main() { 
    B b1; 
    B b2 = b1; 
    cout << "Number: " 
     << b2.m << endl; 
}; 

Perché non è b2.m = 50? Sto cercando di copiare un oggetto b e ho il costruttore di copia B (const A & x): m (50). Ho bisogno di creare una copia per il culo della classe derivata? Mi piace B (const B & x) ?? Ho pensato che poiché un oggetto b ha una parte, potremmo usare B (const A & x): m (50) invece del costruttore predefinito:: SEreditarietà copia-costruttore

Nel caso in cui si abbia una funzione con il parametro di un oggetto A, è possibile inviare un oggetto B. Come mai si differenzia con il costruttore di copie?

risposta

14

La ragione è che B(const A& x) non è una copia ctor - costruttore di copia per tipo T deve sempre avere un riferimento alla lvalue T come prima (e non hanno altri argomenti non predefiniti) argomento. La classe non ha copy-ctor definito, quindi il compilatore genera quello predefinito, che esegue una copia membro-saggio, quindi perché b2.m corrisponde a b1.m.

Un costruttore non template per la classe X è un costruttore di copia se il suo parametro prima è di tipo X&, const X&, volatile X& o const volatile X&, e uno non ci sono altri parametri, altrimenti tutti gli altri parametri hanno argomenti di default (8.3 0,6).

1

I costruttori di copia devono essere dello stesso tipo.

Non si è effettivamente creato un costruttore di copie. B(const A & x) è solo un costruttore che prende uno const A come riferimento.

Quindi, non è necessario crearne uno per la classe derivata "pure", ma "affatto". Come hai affermato, il tipo di questo sarà B(const B &x).

1

Il copia-ctor predefinito per le classi di tipo B sarebbe B (const B &). Dato che non hai specificato questo, il compilatore gentilmente lo genera per te.

È diverso con metodi definiti dall'utente come tali non possono essere generati dal compilatore.