2013-03-19 5 views
0
#include<iostream> 
using namespace std; 

class base 
{ 
    public: 
     virtual void f(){} 
}; 

class middle1:public base 
{}; 

class middle2:public base 
{}; 

class derive:public middle1,public middle2 
{}; 



int main() 
{ 
    derive* pd=new derive(); 
    pd->f(); 
    return 0; 
} 

저는이 가상이이 문제를 해결하지만 그 방법을 알고 있습니까? 다중 상속이 없더라도 안전을 위해 공개 가상을 작성할 수 있습니까?클래스 A와 공용 가상 B와 클래스 A의 차이점은 무엇입니까? public B

+0

virtual은 메소드와 멤버 변수의 복사본을 middle2가 아닌 base에서 가져옵니다. – Prasad

답변

2

derive의 각 인스턴스는 middle1 기본 클래스 하위 개체와 middle2 기본 클래스 하위 개체를가집니다. 상속이 아닌 가상 경우

는 다음 middle1 기본 클래스 하위 개체는 middle2 기본 클래스 하위 개체도 base 기본 클래스의 하위 객체를 갖고 base 기본 클래스의 하위 객체를 갖는다. 따라서 derive의 각 인스턴스에는 두 개의 base 하위 개체가 있으며 pd->f()이라는 호출은 모호합니다. base 개체 중 f()을 호출 하시겠습니까?

상속을 가상으로 만드는 것은 middle1middle2base 하위 개체 derive을 공유한다는 것을 의미합니다. 이렇게하면 f()이 호출 될 수있는 하나의 base 개체 만 존재합니다.

우리는 항상

반드시 그렇지는 안전

공공 가상을 작성할 수 있습니다. middle1middle2이 공용 base 하위 개체를 공유하려고하지 않는 상속 계층이있을 수 있습니다.당신은 아마 이러한 경우에, 당신은 모두를 상속하는 클래스 derive를 작성되어서는 안된다는 주장 할 수 있지만, 그 상황에 결국 할 경우 다음 해결 방법을 수행하는 것 중 하나

static_cast<middle1*>(pd)->f(); 
pd->middle1::f(); 

하는 지정하려면 당신은 middle2를 지정 middle1 기본 클래스 하위 개체에 대한 f, 또는

static_cast<middle2*>(pd)->f(); 
pd->middle2::f(); 

를 호출 할 것이다.

1

저는이 가상이이 문제를 해결하지만 그 방법을 알고 있습니다.

virtual 키워드는 하나의 상위 순서 기본 클래스 하위 개체가 상속 계층 구조에 존재하는 것으로함으로써 문제를 해결한다. 그것없이 각 부모 클래스 middle1 & middle2base 클래스의 자신의 사본을 가지므로 모호함을 초래합니다.

다중 상속이없는 경우에도 우리는 항상 안전을 위해 공용 가상을 작성할 수 있습니까?

다중 상속이없는 경우 virtual 상속을 사용할 이유가 없습니다. 다중 상속은 가상 상속 개념의 목적입니다.

1

가상 기본 클래스는 다이아몬드 문제를 해결하기 위해 추가 간접 수준을 구현합니다 (this question 참조).

항상 가상 상속을 사용하는 경우 추가 간접 수준으로 인한 성능 저하가 항상 발생합니다.

따라서 가상 상속을 사용하는 것이 좋습니다.

관련 문제