반응형
가상 상속에서 기본 생성자가 호출되는 이유는 무엇입니까?
다음 코드에서 유형의 개체를 인스턴스화 할 때 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 항목을 참조하십시오 .
참고 URL : https://stackoverflow.com/questions/9907722/why-is-default-constructor-called-in-virtual-inheritance
반응형
'Program Tip' 카테고리의 다른 글
log4j가 자체 구성에 사용한 파일을 표시하도록 할 수 있습니까? (0) | 2020.10.30 |
---|---|
REST (RESTful) API를 통한 대량 수집 조작 (0) | 2020.10.30 |
Directory.GetFiles () 액세스가 거부 된 경우 폴더 / 파일 무시 (0) | 2020.10.30 |
.NET 리플렉션의 "비용"은 얼마입니까? (0) | 2020.10.30 |
unique_ptr은 이동 후 nullptr을 저장하도록 보장됩니까? (0) | 2020.10.30 |