> 백엔드 개발 > C++ > 파생 클래스 개체가 인스턴스화될 때 가상 기본 클래스의 기본 생성자가 호출되는 이유는 무엇입니까?

파생 클래스 개체가 인스턴스화될 때 가상 기본 클래스의 기본 생성자가 호출되는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-20 04:22:02
원래의
687명이 탐색했습니다.

Why is the Default Constructor of a Virtual Base Class Invoked when a Derived Class Object is Instantiated?

가상 상속의 기본 생성자 호출

C 상속 메커니즘인 가상 상속은 다이아몬드 상속 또는 반복 상속 문제를 해결하는 것을 목표로 합니다. 이러한 맥락에서 질문이 생깁니다. 파생 클래스 객체를 인스턴스화할 때 가상 기본 클래스의 기본 생성자가 호출되는 이유는 무엇입니까?

이 동작은 가상 상속 설계에서 비롯됩니다. 기본 클래스 생성자가 초기화 목록을 통해 파생 클래스 생성자에 의해 호출되는 기존 상속과 달리 가상 상속에서는 가장 많이 파생된 클래스의 생성자가 가상 ​​기본 클래스의 생성자를 직접 호출합니다.

제공된 예:

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;
    }
};
로그인 후 복사

도터 유형의 객체를 인스턴스화할 때 도터 생성자는 할머니 생성자를 직접 호출합니다. 다만, 딸 생성자의 초기화 목록에는 특정 생성자가 호출되지 않으므로 기본적으로 할머니의 기본 생성자가 호출된다.

원하는 생성자를 명시적으로 호출하려면 딸 생성자의 초기화 목록을 수정해야 한다. to:

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

이렇게 하면 할머니의 올바른 생성자가 호출되고 출력에 다음 줄이 포함됩니다.

grandmother: 0
로그인 후 복사

가상 작업 시 이 동작을 이해하는 것이 중요합니다. 상속은 적절한 초기화와 객체 생성을 보장합니다.

위 내용은 파생 클래스 개체가 인스턴스화될 때 가상 기본 클래스의 기본 생성자가 호출되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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