0

요즘 저는 VS2010에서 C++ 프로그래밍에서 OO를 배우고 있습니다. C++에서 기본적인 상속 문제를 만났습니다.C++의 몇 가지 기본 상속 문제

질문 1 :

class bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 

class A:virtual public bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 


class B:virtual public bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 

class D:virtual public bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 


class C:public A,public B,public D 
{ 

}; 

컴파일러는 나에게 오류 C2250을 제공 여기 내 코드입니다. 각 클래스에서 가상 상속을 제거합니다. 즉

class bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 

class A:public bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 


class B:public bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 

class D:public bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 


class C:public A,public B,public D 
{ 

}; 

이 적용됩니다. 또한, 오류 코드에서 C 클래스의 virtual void name(){};을 다시 작성하면 컴파일러가 잘됩니다. 제 질문은 왜 가상 상속 상황에서 가상 함수를 다시 작성해야하는지, 그리고 가상 상속 상황에서는 불필요한 것입니다.

질문 2 : 위의 코드로

, 내가 아닌 가상 상속 상황

class bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 

class A:public bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 


class B:public bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 

class D:public bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 


class C:public A,public B,public D 
{ 
    virtual void name(){}; 
}; 

//bs *mybs = new C(); //C2594 

컴파일러에 bs *mybs = new C();를 추가 할 오류 C2594을 말한다. 그러나 가상 상속 상황에서 컴파일러에는 오류가 없습니다.

class bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 

class A:virtual public bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 


class B:virtual public bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 

class D:virtual public bs 
{ 
public: 
    int a; 
    virtual void name(){}; 
}; 


class C:public A,public B,public D 
{ 
    virtual void name(){}; 
}; 

bs *mybs = new C();//It is OK 

가상 계승 상황은 어떻게됩니까?

이 두 가지 질문은 어렵지 않지만 C++에서는 기본이라고 생각합니다. 그러나 C++ 버전의 OO에 익숙하지 않습니다. 문제를 해결해 주셔서 감사합니다.

+1

컴파일러 오류 텍스트를 게시하면 찾을 필요가 없습니다. – Melanie

+0

http://msdn.microsoft.com/en-us/library/6fts3ys1.aspx, http://www.parashift.com/c++-faq/multiple-inheritance.html – Spook

+1

내 VS2010이 버전이 아니므로 죄송합니다. 영어로.오류 문안은 다른 언어로되어 있습니다 : ( – zhfkt

답변

1

1 : 주어진 상속 가상 클래스는 bs 개체의 인스턴스 하나만 가져 오지만 name()의 세 가지 구현이 있으며 사용할 개체를 알 수 없습니다. 비 가상으로 파생 된 경우 A, B 및 D 클래스에 세 개의 bs 기본이 포함되며 각 클래스는 구현을 재정의 할 수 있습니다. 또는, 당신은 당신이 C에서 하나의 구현과 가상 상속 후 모호한 구현을 대체 할 수있는 것으로 나타났습니다

Q2 : 비 가상 상황에서, 당신이 포함 된 A의 세 bs 기지를 가지고, B와 D 객체 : 어떤 이 중 포인터를 원하십니까? 모호하므로 오류가 발생합니다. 가상 상속을 사용했다면 bs 기본 객체가 하나 뿐이므로 포인터를 가져올 수 있습니다.

는 설명하기 :

왼쪽에
VIRTUAL   NON-VIRTUAL 
.  bs   bs bs bs 
. /| \  | | | 
.  A B D  A B D 
.  \ |/  \ |/
.  C    C 

, 문제가 C 당신이 C에 세 가지를 모두 오버라이드하지 않는 한 A::name(), B::name() 또는 D::name()으로 사용할 몰랐했다.

오른쪽에서 b* my_b_ptr은 (는) bs 개의 기본 지점을 알지 못했습니다.