> 백엔드 개발 > C++ > 가상 상속이 C에서 기본 생성자를 트리거하는 이유는 무엇입니까?

가상 상속이 C에서 기본 생성자를 트리거하는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-22 12:32:17
원래의
642명이 탐색했습니다.

Why Does Virtual Inheritance Trigger the Default Constructor in C  ?

C의 가상 상속 이해: 기본 생성자가 호출되는 이유

객체 지향 프로그래밍 영역에서 상속은 코드 구성 및 코드 재사용에 있어 중추적인 역할을 합니다. 그러나 가상 상속을 사용하면 특정 동작이 예상치 못할 수 있습니다. 이 글의 목적은 C의 특정 상속 유형인 가상 상속의 맥락에서 기본 생성자가 호출되는 이유를 설명하는 것입니다.

가상 상속: 간략한 소개

가상 상속은 이러한 문제를 해결하는 데 사용됩니다. 다중 상속 시나리오의 모호성 이를 통해 다이아몬드 모양의 상속 문제를 일으키지 않고 여러 파생 클래스가 공통 기본 클래스에서 상속할 수 있습니다. 이러한 경우 가상 기본 클래스는 한 번만 상속되며 해당 생성자는 가장 많이 파생된 클래스에서 직접 호출됩니다.

딜레마: 기본 생성자 호출

다음 코드 조각을 고려하세요.

class grandmother {
public:
    grandmother() { cout << "grandmother (default)" << endl; }
    grandmother(int attr) { cout << "grandmother: " << attr << endl; }
};

class mother: virtual public grandmother {
public:
    mother(int attr) : grandmother(attr) { cout << "mother: " << attr << endl; }
};

class daughter: virtual public mother {
public:
    daughter(int attr) : mother(attr) { cout << "daughter: " << attr << endl; }
};

int main() {
    daughter x(0);
}
로그인 후 복사

이 코드를 실행하면 이상한 동작이 발생합니다. 예상할 수 있듯이 딸 클래스에 대한 Grandman(int) 생성자를 호출하는 대신 할머니 클래스에 대한 기본 생성자가 트리거됩니다. 그러면 기본 생성자가 왜 호출되는가?

Unraveling the Mystery: The Virtual Inheritance Effect

이 동작을 이해하는 열쇠는 가상 상속의 본질에 있습니다. 가상 상속이 사용되면 가상 기본 클래스의 생성자는 가장 많이 파생된 클래스의 생성자에 의해 직접 호출됩니다. 이 시나리오에서는 딸이 가장 많이 파생된 클래스이므로 해당 생성자가 할머니 생성자를 호출하는 역할을 담당합니다.

그러나 할머니(int) 생성자에 대한 명시적인 호출이 딸의 초기화 목록에 지정되지 않았기 때문에 생성자가 없으면 기본 생성자가 대신 호출됩니다. 이를 수정하려면 다음과 같이 원하는 할머니 생성자를 명시적으로 호출해야 합니다.

daughter(int attr) : grandmother(attr), mother(attr) { ... }
로그인 후 복사

이 수정을 통해 할머니 클래스에 대한 올바른 생성자가 호출됩니다.

결론

가상 상속 영역에서 예기치 않은 동작을 방지하려면 생성자 호출의 메커니즘을 이해하는 것이 필수적입니다. 가상 기본 클래스의 생성자가 가장 많이 파생된 클래스의 생성자에 의해 직접 호출된다는 점을 이해하면 생성자 호출의 흐름을 예측하고 제어할 수 있습니다. 이러한 지식을 통해 개발자는 C에서 강력하고 잘 구조화된 상속 계층 구조를 설계할 수 있습니다.

위 내용은 가상 상속이 C에서 기본 생성자를 트리거하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿