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

¿Por qué no es b2.m = 50? Estoy intentando copiar un objeto b y tengo el constructor de copia B (const A & x): m (50). ¿Necesito hacer un copy c'tor para el asno de clase derivado? Al igual que B (const B & x) ?? Pensé que dado que un objeto b tiene una parte, podríamos usar B (const A & x): m (50) en lugar del constructor predeterminado:: SCopiar herencia del constructor

En el caso de que tenga una función con el parámetro de un objeto A, puede enviar un objeto B. ¿Cómo puede ser diferente con el constructor de copia?

Respuesta

14

La razón es que B(const A& x) no es una copia-ctor - constructor de copia para el tipo T debe tener siempre una referencia a lvalue T como la primera (y no tienen otros argumentos no predeterminados) argumento. Su clase no tiene un copiador definido, por lo que el compilador genera el predeterminado, que hace una copia de miembro, por lo que b2.m es lo mismo que b1.m.

Un constructor no molde para la clase X es un constructor de copia si su parámetro de primera es de tipo X&, const X&, volatile X& o const volatile X&, y, o bien no hay otros parámetros o también todos los otros parámetros tienen argumentos predeterminados (8,3 .6).

1

Los constructores de copia deben ser del mismo tipo.

No ha hecho realmente un constructor de copia. B(const A & x) es solo un constructor que toma un const A por referencia.

Por lo tanto, no es necesario crear uno para la clase derivada "también", sino "en absoluto". Como dijiste, el tipo de esto será B(const B &x).

1

El copy-ctor predeterminado para las clases de tipo B sería B (const B &). Como no ha especificado este, el compilador lo genera amablemente.

Es diferente con los métodos definidos por el usuario, ya que no se pueden generar compiladores.

Cuestiones relacionadas