객체 지향 프로그래밍 영역에서 상속은 코드 구성 및 코드 재사용에 있어 중추적인 역할을 합니다. 그러나 가상 상속을 사용하면 특정 동작이 예상치 못할 수 있습니다. 이 글의 목적은 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) 생성자를 호출하는 대신 할머니 클래스에 대한 기본 생성자가 트리거됩니다. 그러면 기본 생성자가 왜 호출되는가?
이 동작을 이해하는 열쇠는 가상 상속의 본질에 있습니다. 가상 상속이 사용되면 가상 기본 클래스의 생성자는 가장 많이 파생된 클래스의 생성자에 의해 직접 호출됩니다. 이 시나리오에서는 딸이 가장 많이 파생된 클래스이므로 해당 생성자가 할머니 생성자를 호출하는 역할을 담당합니다.
그러나 할머니(int) 생성자에 대한 명시적인 호출이 딸의 초기화 목록에 지정되지 않았기 때문에 생성자가 없으면 기본 생성자가 대신 호출됩니다. 이를 수정하려면 다음과 같이 원하는 할머니 생성자를 명시적으로 호출해야 합니다.
daughter(int attr) : grandmother(attr), mother(attr) { ... }
이 수정을 통해 할머니 클래스에 대한 올바른 생성자가 호출됩니다.
가상 상속 영역에서 예기치 않은 동작을 방지하려면 생성자 호출의 메커니즘을 이해하는 것이 필수적입니다. 가상 기본 클래스의 생성자가 가장 많이 파생된 클래스의 생성자에 의해 직접 호출된다는 점을 이해하면 생성자 호출의 흐름을 예측하고 제어할 수 있습니다. 이러한 지식을 통해 개발자는 C에서 강력하고 잘 구조화된 상속 계층 구조를 설계할 수 있습니다.
위 내용은 가상 상속이 C에서 기본 생성자를 트리거하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!