-
13-09-2019 - |
문제
나는 다이아몬드 문제를 겪고 있었고 다양한 시나리오에서 작동 할 것이라고 생각했습니다. 그리고 이것은 내가 일하고 있던 그들 중 하나입니다.
#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 의이 훌륭한 기사를 참조하십시오. "유용한 것으로 간주 된 다중 상속" 이것을 올바르게 수행하는 방법에 대해.