2016-08-29 26 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::來區分x,否則derived即使您沒有鑽石繼承。

忽略暫時在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

而不是引用含糊xy,並且z變量,使用base1.xbase2.x。例如:

CHANGE

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; 

或郵寄至:(如果你想改變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