2009-08-12 8 views
1

나는 다이아몬드 문제를 겪고 있었고 다양한 시나리오에서 효과가있을 것이라고 생각했다. 그리고 이것은 내가 작업하고있는 것들 중 하나입니다.다이아몬드 문제

#include <iostream> 
using namespace std; 
class MainBase{ 

    public: 
    int mainbase; 
    MainBase(int i):mainbase(i){} 
    void geta() 
    { 
     cout<<"mainbase"<<mainbase<<endl; 
    } 
}; 
class Derived1: public MainBase{ 

    public: 
    int derived1; 
    int mainbase; 
    Derived1(int i):MainBase(i),derived1(i) {mainbase = 1;} 
    public: 
    void getderived1() 
    { 
     cout<<"derived1"<<derived1<<endl; 
    } 

}; 
class Derived2: public MainBase{ 

    public: 
    int derived2; 
    int mainbase; 
    Derived2(int i):MainBase(i),derived2(i){mainbase = 2;} 
    public: 
    void getderived2() 
    { 
     cout<<"derived2"<<derived2<<endl; 
    } 
}; 
class Diamond: public Derived1, public Derived2{ 

    public: 
    int diamond; 
    int mainbase; 
    Diamond(int i,int j, int x):Derived1(j),Derived2(x),diamond(i){mainbase=3;} 
    public: 
    void getdiamond() 
    { 
     cout<<"diamond"<<diamond<<endl; 
    } 
}; 
int main() 
{ 
    Diamond d(4,5,6); 
// cout<< d.MainBase::mainbase; 
    cout<<"tested"<<endl; 
    cout<<d.mainbase; 
    cout<<d.Derived2::mainbase<<endl; 
    cout<<d.Derived1::mainbase<<endl; 
    /*cout<<d.Derived2::MainBase::mainbase<<endl; 
    cout<<d.Derived1::MainBase::mainbase<<endl;*/ 
} 

어떻게 MainBase 클래스 메인베이스 변수에 액세스합니까? 모든 입력.

+0

이 코드를하시기 바랍니다 수정합니다. 모두 선택하고 010101을 누르십시오. – jkeys

+0

실제로, 보는 것은 악몽입니다. : –

+1

다이아몬드 문제 : "다중 상속 및 지식 조직이있는 객체 지향 프로그래밍 언어에서 다이아몬드 문제는 두 클래스 B와 C가 A에서 상속 받고 클래스 D가 B와 C에서 상속 될 때 발생하는 모호성입니다. D의 메소드는 A에 정의 된 메소드를 호출하고 (메소드를 대체하지는 않습니다.) B와 C는 메소드를 다르게 오버라이드 한 다음 클래스가 B 또는 C를 상속합니다. "source : http : // en .wikipedia.org/wiki/Diamond_problem – Adriaan

답변

5

당신은 당신이 한 일을 수행

cout<<d.Derived2::MainBase::mainbase<<endl; 
cout<<d.Derived1::MainBase::mainbase<<endl; 

, 그것은 당신이 달성하려고하는 일을하지 않을 수 있습니다. 가능하면 virtual 상속을 사용해야합니까? 가지고있는 것은 개체에 MainBase 개의 구성원이 두 개 (각 상속 트랙 당 하나씩)있을 것임을 의미합니다.

(MSDN에서). 베이스 클래스가 가상 기본으로 지정되면

, 그것은 데이터 부재 중복없이 한 번보다 더 간접 염기로서 작용할 수있다. 데이터 멤버의 단일 복사본은 이 가상베이스로 사용하는 모든 기본 클래스에서 공유하는 입니다.

아마 이런 일이 더 잘 맞는 것 : 다이아몬드 인스턴스의 도심 Mainbase를 참조 할 때 컴파일되지 않습니다

class Derived1: virtual public MainBase{ 
+0

@ 1800 정보 감사합니다. – Lakshmi

0

당신은 Diamond 클래스에서 다음과 같이 액세스 할 수 있어야합니다 :

Diamond::foo() { 
    Mainbase::mainbase = 0; 
} 

는 코드가 처음에 제대로 컴파일한다고 가정. 컴파일에 대한 자세한 내용은 Michael Foukarakis' answer을 참조하십시오. 또한 올바르게 수행하는 방법에 대해서는 DDJ : "Multiple Inheritance Considered Useful"의 우수 기사를 참조하십시오.

2

코드는, 모호성이있다. 이 같은 기본 클래스의 단일 인스턴스를 공유하도록 허용함으로써이 모호성을 해결하기 위해 파생 클래스 (Derived1, Derived2)에서 가상를 사용해야합니다 :

class Derived1: virtual public Mainbase { 
/* do your thing here*/ 
}; 
관련 문제