클래스가 가상 및 비 가상베이스로 사용되는 것을 본 적이 없습니다 (즉, 일부 클래스가 상위 클래스로 의도 된 경우 대개 가상 또는 비 가상의 상속 유형에 대해 미리 알고 있습니다).은 기본 클래스 목록에 가상의 상속을 나타내는 올바른 장소가 있습니까?
그래서 나는 C++에서 오류가 발생하기 쉬운 기본 클래스 목록의 "가상"상속을 전문으로하는 자유가 있다고 가정합니다. "가상"으로 기본 클래스 자체를 지정하는 것이 더 좋습니다.
아니면 내가 틀렸습니까?
그렇다면 아무도 이러한 "가상"클래스에 대한 우발적 인 비 가상 상속을 방지하기위한 기술을 설명 할 수 있습니까?
또는 향후 C++ 표준에 대한 견해가 있습니까?
(죄송합니다 중복 된 경우)
몇 가지 예
1) 일부 참조 - 셀 기반 smartpointer가 가리킬 수있는 모든 클래스를 기본으로 클래스를 ReferenceCounted. 이 기본 인스턴스 (및 참조 카운터)의 중복을 방지해야합니다. 최적화를 제외하고는이 클래스를 비 가상베이스로 사용할 이유가 없습니다.
2) 인터페이스 계층과 (인터페이스 계층 I 많은 경우 비가 상 상속 개념 필요가되지 않는다고 생각
// interfaces: struct BaseIface{ void virtual func()=0; }; struct DerivedIface: public virtual BaseIface{ void some_another_func()=0; } // implementations class BaseImpl: public virtual BaseIface{ void virtual func(){....}; } class DerivedImpl: public BaseImpl, public virtual DerivedIface{ void some_another_func(){...}; }
)이 경우의 "가상"이어야 구현들의 대응 계층을 가상 상속 오버 헤드를 줄이는 데에만 사용됨 (때때로 static_cast <>에 대한 능력이 부족함)
Java는 인터페이스에 대한 상속을 가상으로 사용하며 불만을 전혀 모릅니다. 이 언어는 "논 가상"가 결여되어있다. C++보다 덜 표현적인 언어이지만이 "기능"은 주된 잘못이 아닙니다.
당신은 그냥 "게으른"가상 상속 및 솔루션 문제 설명이 그러나 가장 기본은 "가상"정의, 하나 (대부분의 파생되지 않은) 클래스 을 즉 "nonlazy"를 사용하는 것입니다, 아마 잘 설명해야한다 내 의도, 그래서 내 질문에 몇 가지 예제를 추가했습니다. – user396672