C의 다중 상속을 통해 클래스는 여러 기본 클래스에서 상속 될 수 있습니다. 이는 파생 된 클래스가 모든 상위 클래스의 멤버 (데이터 및 기능)를 획득 할 수 있음을 의미합니다. 컴파일러는 모든 기본 클래스의 멤버 선언을 파생 클래스로 결합합니다. 그러나이 겉보기에 간단한 메커니즘은 몇 가지 복잡성을 소개합니다.
작동 방식 : 파생 클래스가 여러 기본 클래스에서 상속 될 때, 모든 대중 및 보호 된 구성원 (생성자 및 파괴자 제외는 물려받지 않지만 물체 생성 및 파괴 중에 호출)을 물려받습니다. 이름 충돌이있는 경우 (두 개의 기본 클래스에 이름이 같은 멤버가있는 경우) 컴파일러는이 모호성을 해결해야합니다. 이 해상도는 스코프 해상도 연산자 (: :)를 사용하여 명시 적으로 수행 할 수 있습니다. 예를 들어, BaseA
와 BaseB
모두 함수 foo()
가지고 있고 둘 다에서 Derived
Derived
상속은 BaseA::foo()
또는 BaseB::foo()
사용하여 명확하게 설명해야합니다.
도전 과제 :
다중 상속에서 모호성을 피하려면 신중한 계획 및 코딩 관행이 필요합니다.
process()
또는 data()
와 같은 일반적인 이름을 피하십시오. 대신 processOrder()
또는 customerData()
와 같은 설명 이름을 사용하십시오.BaseA::foo()
."다이아몬드 문제"는 클래스가 공통 조상을 공유하는 두 클래스에서 상속 될 때 발생합니다. 가상 상속이 없으면 공통 조상은 파생 클래스의 객체에 복제되어 데이터 불일치와 잠재적 오류로 이어집니다.
가상 상속은 파생 클래스의 객체에 공통 조상의 하나의 인스턴스 만 존재하도록함으로써이를 해결합니다. 이것은 공통 조상을 중간 클래스에서 가상 기본 클래스로 선언함으로써 달성됩니다.
예:
<code class="c ">class Animal { public: int legs; }; class Mammal : virtual public Animal {}; class Bird : virtual public Animal {}; class Platypus : public Mammal, public Bird {};</code>
이 예에서 Animal
포유 Mammal
과 Bird
의 가상 기본 클래스입니다. Platypus
Animal
의 legs
멤버 인 한 개의 인스턴스 만 있으므로 다이아몬드 문제를 방지합니다. virtual
키워드가 없으면 Platypus
에는 Animal
회원의 사본이 두 개 있습니다.
예, 여러 디자인 패턴은 여러 상속에 대한 대안을 제공합니다.
이러한 대안은 일반적으로 여러 상속보다 모듈 식, 유연하며 유지 관리 가능한 코드로 이어 지므로 종종 C에서 선호됩니다. 그들은 더 나은 코드 조직을 촉진하고 여러 상속과 관련된 미묘한 버그를 도입 할 위험을 줄입니다.
위 내용은 여러 상속은 C에서 어떻게 작동하며 그 과제는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!