2011-10-15 7 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; 
}; 

Pourquoi b2.m n'est pas 50? J'essaye de copier un b-object et j'ai le constructeur de copie B (const A & x): m (50). Ai-je besoin de faire un copieur pour le cul de classe dérivé bien? Comme B (const B & x)? Je pensais qu'un b-objet ayant une partie, nous pourrions utiliser B (const A & x): m (50) au lieu du constructeur par défaut:: SHéritage de constructeur de copie

Dans le cas où vous avez une fonction avec le paramètre d'un objet A, vous pouvez envoyer un objet B. Comment se fait-il que cela diffère avec le constructeur de copie?

Répondre

14

La raison est que B(const A& x) n'est pas une copie-cteur - constructeur de copie pour le type T doit toujours prendre une référence lvalue à T comme le premier (et ne pas avoir d'autres arguments non par défaut) argument. Votre classe n'a pas de copy-ctor défini, donc le compilateur génère celui par défaut, qui fait une copie de membre-sage, par conséquent pourquoi b2.m est le même que b1.m.

Un constructeur non-modèle pour la classe X est un constructeur de copie si le paramètre de première est de type X&, const X&, volatile X& ou const volatile X&, et soit il n'y a pas d'autres paramètres ou d'autre tous les autres paramètres ont des arguments par défaut (8.3 .6).

1

Les constructeurs de copie doivent être du même type.

Vous n'avez pas créé de constructeur de copie. B(const A & x) est juste un constructeur qui prend un const A par référence. Donc, vous n'avez pas besoin de faire un pour la classe dérivée "aussi bien", mais "pas du tout". Comme vous l'avez dit, le type sera B(const B &x).

1

La copie-ctor par défaut pour les classes de type B serait B (const B &). Puisque vous n'avez pas spécifié celui-ci, le compilateur le génère gentiment pour vous.

Son différent avec des méthodes définies par l'utilisateur comme celles qui ne peuvent pas être générées par le compilateur.