그래서이 아이디어가 있고 기본적으로 C++로 구현하는 것은 불가능하다고 생각하지만 ... 물어보고 싶습니다. 저는 Stroustrup의 15 장을 읽었고 제 응답을 얻지 못했습니다. 상속 다이아몬드에 대한 10 억 개의 다른 질문이이 질문에 대답하지 않는다고 생각합니다. 그래서 여기에서 묻고 있습니다.비대칭 가상 상속 다이아몬드 in C++
일반적인 기본 클래스를 공유하는 두 기본 클래스에서 상속을 받지만 두 클래스 중 하나만 가상적으로 상속 할 때 어떤 일이 발생합니까? 예를 들어 :
내가 전체 라이브러리를 재 컴파일 할 필요없이 기존 라이브러리를 확장하는 것을 시도하고 있기 때문에 내가 이렇게 할 생각 이유는class CommonBase { ... };
class BaseA : CommonBase { ... };
class BaseB : virtual CommonBase { ... };
class Derived : BaseA, BaseB { ... };
는 (벌레의 깡통을 열고 싶지 않다). 이미 수정하려는 상속 체인이 있습니다. 기본적으로 이런 식으로 (아스키 미술을 변명하십시오)
LibBase
| \
| \
| MyBase
| |
| |
LibDerived |
| \ |
| \ |
| MyDerived
| |
LibDerived2 |
| \ |
| \ |
| MyDerived2
| |
LibDerived3 |
| \ |
| \ |
| MyDerived3
| |
LibConcrete |
\ |
MyConcrete
사진을 찍으시겠습니까? "My
"클래스의 각 객체를 이 되려면 클래스의 객체가 본질적으로 바뀌지만 상속 다이어그램의 다음 클래스는 기본 클래스 인 "My
"의 오버라이드 된 메소드 구현을 사용하고 싶습니다. 도서관 수업의 다른 방법들. 그것은이
class LibDerived : LibBase
처럼 그래서 라이브러리 클래스가 실질적으로 상속하지 않습니다하지만 할 경우 내 수업이 거의
class MyBase : virtual LibBase {};
class MyDerived: virtual MyBase, virtual LibDerived {};
MyDerived
이후 상속합니다 vtable에있을 것이다, 그리고 MyBase
는 vtable에있을 것이다,이있을 것 단 하나의 LibBase
개체입니까?
나는이 질문이 충분히 희망적이기를 바랍니다.
왜이 기능을 원하십니까?: p – jalf
앞에서 말했듯이, 라이브러리의 클래스의 멤버 함수를 오버라이드하는 클래스를 생성하여 라이브러리의 기능을 확장하려고하지만 해당 클래스에서 상속받은 객체는 여전히 라이브러리에서 사용할 수 있습니다 . 확장하고자하는 구체적인 클래스는 구현을 변경하려는 기본 클래스에서 4 단계의 상속입니다. 다른 파생 된 클래스에서도 해당 기능을 재사용해야하는 곳을 알 수 있으므로 구체적인 클래스에서 필요한 메서드를 재정의하는 것만으로는 충분하지 않습니다. – cheshirekow