No entiendo por qué en el siguiente código, cuando instancia un objeto de tipo daughter
el valor por defecto grandmother()
se llama el constructor?
Pensé que o bien el grandmother(int)
se debe llamar al constructor (para seguir la especificación de mi mother
constructor de clase), o este código no debería compilarse en absoluto debido a la herencia virtual.
Aquí el compilador llama silenciosamente grandmother
constructor predeterminado en mi espalda, mientras que nunca lo pedí.
#include <iostream>
class grandmother {
public:
grandmother() {
std::cout << "grandmother (default)" << std::endl;
}
grandmother(int attr) {
std::cout << "grandmother: " << attr << std::endl;
}
};
class mother: virtual public grandmother {
public:
mother(int attr) : grandmother(attr) {
std::cout << "mother: " << attr << std::endl;
}
};
class daughter: virtual public mother {
public:
daughter(int attr) : mother(attr) {
std::cout << "daughter: " << attr << std::endl;
}
};
int main() {
daughter x(0);
}
¿Qué compilador (y versión)? ¿Con qué argumentos lo compilaste?
– orlp
28 de marzo de 2012 a las 12:46
gcc 4.6.3 20120306 (Red Hat 4.6.3-2) en fedora 15. Los argumentos son: -O0 -g3 -Wall -c -fmessage-length=0
– Simón Desfarges
28 de marzo de 2012 a las 12:47
g ++ 4.1.2 tiene el mismo problema: codepad.org/L0jBXfSP
– orlp
28 de marzo de 2012 a las 12:49
La instantánea de Ubuntu 4.7 con -Wall -pedantic-errors reproduce esto.
– juanchopanza
28 de marzo de 2012 a las 12:51