2016-08-29 6 views
-2
Please have a look at the code: 
#include <iostream> 
using namespace std; 

class base1 
{ 
public: 
    int x,y; 
}; 
    class base2 
{ 
public: 
    int x, z; 
}; 

class derived: virtual public base1,virtual public base2 
{ 
    public: 
    void display(int a, int b, int c) 
    { 
     x=a; 
     y=b; 
     z=c; 
     cout<<x<<endl<<y<<endl<<z<,endl; 

    } 
}; 

int main() 
{ 
    derived dr; 
    dr.display(1,2,3); 
} 

기본 클래스 인 base1과 base2가 가상으로 만들어 지므로이 클래스의 x 선언 문제를 해결해야합니다. 하지만 그렇지 않습니다. 그것은 나에게 오류가 발생했습니다 : 오류 : 'x'에 대한 참조가 모호합니다 빛을 넣어 주실 수 있습니까?C++에서 다이아몬드 문제를 제거 할 수 없습니다.

+1

A)를 더 다이아몬드가 없습니다. B) 컴파일러는 당신이 원하는'x'를 어떻게 알아 내야할까요? 어떤'x'를 수정하고 싶은지 알고 있습니까? – NathanOliver

+0

가상 상속은 멤버를 "병합"하지 않으며 기본 클래스 하위 개체를 "병합"합니다. – aschepler

+0

예. 다이아몬드 문제는 아닙니다. 동의했다. 기본 클래스 1에서 x를 수정하고 싶습니다. – coder999

답변

1

이 다이아몬드 상속 문제가되지 않습니다 예를 들어, . 당신은이 :

base1 base2 
^ ^
|  | 
\ /
    \ /
    \/
    \/ 
derived 

문제는 base1base2 모두 회원 x을 가지고있다.

당신은 당신이 다이아몬드 상속을하지 않더라도 base1:: 또는 base2::를 사용하여 derived에서 x을 명확하게 할 필요가있다.

derived::display에 멤버 변수의 값을 변경하기위한 이론적 근거를 당분간 무시, 당신은 사용할 수 있습니다

class derived: virtual public base1,virtual public base2 
{ 
    public: 
     void display(int a, int b, int c) 
     { 
     base1::x=a; 
     y=b; 
     z=c; 
     cout<<base1::x<<endl<<y<<endl<<z<<endl; 
     } 
}; 
-1
대신 모호한 x, y에 참조의

z 변수는 base1.x 또는 base2.x 사용합니다.

변경

x=a; 
    y=b; 
    z=c; 
    cout<<x<<endl<<y<<endl<<z<<endl; 

TO

base1 b1; 
    base2 b2; 
    b1.x=a; 
    b2.x=a; 
    b1.y=b; 
    b2.z=c; 
    cout<<b2.x<<endl<<b1.y<<endl<<b2.z<,endl; 

TO OR : (당신이 this 값을 변경하고자한다면)

base1::x=a; 
    base2::x=a; 
    base1::y=b; 
    base2::z=c; 
    cout<<base2::x<<endl<<base1::y<<endl<<base2::z<,endl; 
+0

OP는 로컬 객체의 멤버가 아닌'this' 멤버를 변경하려고합니다. – aschepler

+0

감사의 말씀에 감사드립니다! – coder999