다음 코드에서 유형의 개체를 인스턴스화 할 때 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);
}
답변
가상 상속을 사용할 때 가상 기본 클래스의 생성자는 가장 많이 파생 된 클래스의 생성자에 의해 직접 호출됩니다. 이 경우 daughter
생성자 는 생성자를 직접 호출합니다 grandmother
.
grandmother
초기화 목록에서 생성자를 명시 적으로 호출하지 않았으므로 기본 생성자가 호출됩니다. 올바른 생성자를 호출하려면 다음과 같이 변경하십시오.
daugther(int attr) : grandmother(attr), mother(attr) { ... }
이 FAQ 항목을 참조하십시오 .