2010-08-10 6 views
1

클래스가 가상 및 비 가상베이스로 사용되는 것을 본 적이 없습니다 (즉, 일부 클래스가 상위 클래스로 의도 된 경우 대개 가상 또는 비 가상의 상속 유형에 대해 미리 알고 있습니다).은 기본 클래스 목록에 가상의 상속을 나타내는 올바른 장소가 있습니까?

그래서 나는 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++보다 덜 표현적인 언어이지만이 "기능"은 주된 잘못이 아닙니다.

답변

1

기본 클래스에서이 작업을 수행 할 수있는 방법은 없습니다 (실제로는 그렇게하지 않을 수도 있습니다). 가상 클래스와 가상 클래스가 아닌 상속 모두에 기본 클래스를 사용하는 것이 합리적입니다.

인 경우 가장 많이 파생 된 클래스에서 가상 상속을 지정하는 것이 좋습니다. 현재 가상 클래스는 중간 클래스에서 지정되어야합니다. 불행하게도, 내가 그 주위에 많은 방법을 볼 수 없습니다 - 가상 상속 (주로) 클래스가 각각 공통 기반을 가지고 두 개 이상의 다른 클래스에서 파생 필요한 경우가된다하더라도, 가상 상속은 정말 지배하는 방법이 두 다른 클래스는 컴파일, 그래서 당신은 (전용) 대부분의 파생 클래스에 지정된 경우, 당신은 거의 다시 가서 가장 파생 클래스의 지정에 따라 그 중간 클래스를 다시 컴파일해야 할 수도 있습니다 export처럼 뭔가 끝장 가상 상속 (그리고 어느 쪽이든 또는 양방향으로 사용 될 수 있기 때문에 두 가지 방법으로 컴파일 된 중간 클래스를 저장하는 방법이 있습니다).

+0

당신은 그냥 "게으른"가상 상속 및 솔루션 문제 설명이 그러나 가장 기본은 "가상"정의, 하나 (대부분의 파생되지 않은) 클래스 을 즉 "nonlazy"를 사용하는 것입니다, 아마 잘 설명해야한다 내 의도, 그래서 내 질문에 몇 가지 예제를 추가했습니다. – user396672

관련 문제