2009-08-12 94 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類的mainbase變量?任何輸入。

+0

修復代碼,請。全部選中並點擊010101. – jkeys 2009-08-12 05:12:09

+0

確實,這是一場噩夢。 :( – 2009-08-12 05:13:20

+1

鑽石問題:「在與多重繼承和知識組織的面向對象編程語言中,該鑽石的問題是,當出現兩個類B和C從A繼承歧義,和類d從B和C,如果繼承D中的一個方法調用A中定義的方法(並且不覆蓋該方法),並且B和C以不同方式重寫該方法,那麼它從哪個類繼承:B或C?「source:http:// en .wikipedia.org/wiki/Diamond_problem – Adriaan 2009-08-12 07:36:05

回答

5

你做你所做的事有:

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

但是,它可能不是你要實現的目標是什麼。可能的話,你應該使用virtual繼承?你有什麼意思就是說你的對象中有兩個MainBase成員的副本,每個繼承軌道一個。

(來自MSDN)。

當一個基類被指定爲 虛擬的基礎上,它可以作爲除一旦 間接基更起作用,而不重複 它的數據成員的。它的數據成員的 單個副本 由所有 使用它作爲一個虛擬基的基類共享。

也許這樣的事情會更適合你:

class Derived1: virtual public MainBase{ 
+0

@ 1800信息謝謝 – Lakshmi 2009-08-12 05:46:32

0

您應該能夠從Diamond類訪問它是這樣的:

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

假設你的代碼在第一時間正確編譯。有關編譯的更多信息,請參閱Michael Foukarakis'answer。另外,請參閱DDJ的優秀文章:"Multiple Inheritance Considered Useful",瞭解如何正確執行此操作。

2

您的代碼將無法編譯,指Mainbase作爲鑽石實例的基礎時出現混淆。你需要讓他們分享基類的一個實例,像這樣使用在派生類(Derived1,Derived2的)虛擬來解決這種不確定性:

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