가상 상속에서 기본 생성자가 호출되는 이유는 무엇입니까? 사양을 따르기

다음 코드에서 유형의 개체를 인스턴스화 할 때 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 항목을 참조하십시오 .