No entiendo por qué en el siguiente código, cuando instancia un objeto de tipo daughter
, se llama al constructor predeterminado grandmother()
?¿Por qué se llama al constructor predeterminado en herencia virtual?
Pensé que se debería llamar al constructor grandmother(int)
(para seguir las especificaciones de mi constructor de clase mother
), o este código no debería compilarse en absoluto debido a la herencia virtual.
Aquí el compilador llama silenciosamente a grandmother
constructor por defecto 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
gcc 4.6.3 20120306 (Red Hat 4.6.3-2) en fedora 15. Los argumentos son: -O0 -g3 -Wall -c -fmessage-length = 0 –
g ++ 4.1.2 tiene el mismo problema: http: // codepad.org/L0jBXfSP – orlp