문제

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

#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;*/
}

이제 메인베이스 클래스 메인베이스 변수에 액세스하는 방법이 궁금합니다. 모든 입력.

도움이 되었습니까?

해결책

당신은 거기에서 한 일을합니다.

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

그러나 그것은 당신이 달성하려는 일을하지 않을 수 있습니다. 아마도 당신은 사용해야합니다 virtual 계승? 당신이 가진 것은 두 개의 사본이있을 것입니다. MainBase 상속 트랙마다 하나씩 객체에있는 멤버.

(MSDN에서).

기본 클래스가 가상 기반으로 지정되면 데이터 구성원의 복제없이 간접적 인 기반 역할을 할 수 있습니다. 데이터 구성원의 단일 사본은 가상 기반으로 사용하는 모든 기본 클래스에서 공유됩니다.

아마도 이와 같은 것이 당신에게 더 잘 어울릴 것입니다 :

class Derived1: virtual public MainBase{

다른 팁

코드는 컴파일되지 않으며 MainBase를 다이아몬드 인스턴스의 기본으로 언급 할 때 모호성이 있습니다. 사용해야합니다 가상 파생 클래스 (파생 된 1, 파생 된 2) 에서이 모호성을 해결하여 다음과 같은 기본 클래스의 단일 인스턴스를 공유 할 수있게 함으로써이 모호성을 해결합니다.

class Derived1: virtual public Mainbase {
/* do your thing here*/
};

당신은 이렇게 액세스 할 수 있어야합니다. Diamond 수업:

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

코드가 처음에 올바르게 컴파일된다고 가정합니다. 보다 Michael Foukarakis ' 대답 컴파일에 대한 자세한 내용. 또한 DDJ 의이 훌륭한 기사를 참조하십시오. "유용한 것으로 간주 된 다중 상속" 이것을 올바르게 수행하는 방법에 대해.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top