객체 지향 프로그래밍에서 구성력과 파괴력이 수렴할 때: 클래스 상속에 대한 사례 연구
상속 계층 내에서 객체를 생성할 때, 생성자와 소멸자가 호출되는 순서에 관한 근본적인 질문이 발생합니다. 이 조사는 기본 클래스와 파생 클래스의 동작뿐만 아니라 해당 클래스 내 멤버 필드의 영향을 중심으로 이루어집니다. 이 수수께끼를 풀기 위해 예시를 살펴보겠습니다.
다음 C 코드 조각을 고려해 보세요.
struct A { A() { std::cout << "A() C-tor" << std::endl; } ~A() { std::cout << "~A() D-tor" << std::endl; } }; struct B : public A { B() { std::cout << "B() C-tor" << std::endl; } ~B() { std::cout << "~B() D-tor" << std::endl; } A a; };
여기에는 두 개의 클래스 A와 B가 있습니다. 여기서 B는 클래스를 상속받습니다. A. 클래스 B 내에는 A 유형의 멤버 필드 a도 정의되어 있습니다. 클래스 B의 인스턴스를 생성할 때 생성자 호출과 소멸자 호출의 순서는 매우 흥미로운 문제가 됩니다.
구성 역학
코드가 실행됨에 따라 객체의 구성은 기본 클래스에서 시작됩니다. 이 경우 A 클래스는 B의 기본 클래스이므로 A() 생성자가 먼저 호출됩니다. 이어서 파생 클래스의 멤버 필드가 구성됩니다. 클래스 B에는 A 유형의 멤버 필드 a가 있으므로 이 단계에서 A() 생성자가 다시 호출됩니다. 마지막으로 파생 클래스의 생성자 B()가 호출되어 객체 생성이 완료되었음을 나타냅니다.
파괴로 내림차순
객체의 수명주기가 도래하면 끝에서 소멸자 호출 순서는 반대 패턴을 따릅니다. 멤버 필드가 먼저 삭제되고 선언의 역순으로 진행됩니다. 이 예에서 클래스 B의 멤버 필드 a(클래스 A의 인스턴스)에는 소멸자 ~A()가 호출됩니다. 그런 다음 파생 클래스 자체가 소멸되어 ~B() 호출이 트리거됩니다. 마지막으로 기본 클래스의 소멸자 ~A()를 호출한다.
초기화 목록에 관계없이
생성자와 소멸자 호출 순서에 주목해야 한다. 초기화 목록의 유무에 영향을 받지 않습니다. 제공된 코드 조각에는 초기화 목록이 없지만 위에서 설명한 호출 순서는 여전히 유효합니다. 이 일관된 패턴은 다양한 상속 시나리오에서 예측 가능한 생성 및 소멸 흐름을 보장합니다.
위 내용은 C 상속에서 기본 클래스와 파생 클래스의 생성자 및 소멸자 호출 순서는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!