본격적인 클래스와 함께 사용할 때 다중 상속에는 여러 가지 문제가 있지만 모두 모호성을 중심으로 합니다 .
모호성은 몇 가지 다른 방식으로 나타납니다.
- 동일한 필드를 가진 두 개의 기본 클래스가
x
있고 파생 된 유형이 묻는다면 x
무엇을 얻습니까?
- 두
x
변수의 유형이 일치하지 않으면 추론 할 수 있습니다.
- 그것들이 같은 타입이라면, 그것들을 같은 변수에 병합하려고 시도 할 수 있습니다.
- 당신은 항상 이상한 정규화 된 이름으로 노출시킬 수 있습니다.
f
동일한 서명을 가진 동일한 기능을 가진 두 개의 기본 클래스가 있고 누군가 호출 f
하면 호출됩니다.
- 두 기본 클래스가 다른 공통 가상 조상 (다이아몬드 문제)을 공유하면 어떻게 될까요?
- 기능이 다르지만 호환되는 서명이있는 경우 어떻게합니까?
- 두 개의 기본 클래스로 클래스를 구성 할 때 기본 클래스의 생성자 중 어느 것이 먼저 호출됩니까? 당신이 개체를 파괴하면 어느 것이 죽습니까?
- 객체를 메모리에 배치 할 때 어떻게 일관되게 수행합니까?
- 3 가지 기본 클래스로 이러한 모든 사례를 어떻게 처리합니까? 10?
그리고 그것은 동적 디스패치, 타입 추론, 패턴 매칭 및 내가 알지 못하는 것들이 언어가 전체 클래스의 다중 상속을 지원할 때 더 어려워지는 것을 무시합니다.
특성 또는 믹스 인 (또는 인터페이스 또는 ...)은 모호성이 없도록 형식의 기능 을 구체적으로 제한 하는 모든 구성입니다 . 그들은 거의 아무것도 자신을 소유 하지 않습니다 . 이렇게하면 변수가 두 개나 함수가 없기 때문에 유형의 구성이 더 매끄럽게됩니다. 변수와 참조가 있습니다. 기능과 서명. 컴파일러는 수행 할 작업을 알고 있습니다.
다른 일반적인 접근 방식은 사용자가 한 번에 하나씩 유형을 "빌드"(또는 혼합)하도록하는 것입니다. 기본 클래스가 새 유형의 동등한 파트너 인 대신 한 유형을 다른 유형에 추가합니다. 일반적으로 재정의 된 비트의 이름을 바꾸거나 다시 노출하는 선택적 구문을 사용하여 기존 유형을 재정의합니다.
믹스 인 / 특성으로는 불가능하지만 C ++ 스타일 다중 상속으로는 가능합니까?
언어에 따라- 여러 기본 클래스의 변수에 대한 함수 및 스토리지 구현 을 병합 하여 파생 된 유형으로 노출시키는 것은 일반적으로 번거 롭거나 불가능 합니다.
그들과 다이아몬드 문제가 발생할 수 있습니까?
때로는 언어에 따라 덜 심한 변형이 표시되지만 대개는 그렇지 않습니다. 특성의 전체 요점은 이러한 종류의 모호성을 깨뜨리는 것입니다.