다음 코드에서 daughter
유형의 객체를 인스턴스화 할 때 기본 grandmother()
생성자가 호출되는 이유를 모르겠습니까?기본 생성자가 가상 상속에서 호출되는 이유는 무엇입니까?
grandmother(int)
생성자 중 하나 (내 mother
클래스 생성자의 사양을 따르기 위해)를 호출해야하거나이 코드가 가상 상속으로 인해 컴파일되지 않아야한다고 생각했습니다.
여기서 컴파일러는 자동으로 grandmother
기본 생성자를 내 뒤에서 호출하지만, 결코 요구하지 않았습니다.
#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);
}
어떤 컴파일러 (및 버전)입니까? 어떤 주장을 가지고 컴파일 했습니까? – orlp
gcc 4.6.3 20120306 (Red Hat 4.6.3-2) (fedora 15에서) 인수는 다음과 같습니다. 인수 : -O0 -g3 -Wall -c -fmessage-length = 0 –
g ++ 4.1.2에 동일한 문제가 있습니다. http : // codepad.org/L0jBXfSP – orlp