2011-11-22 74 views
0

我有4個類在多重繼承菱形方案下組織。C++多繼承(菱形方案)範例

   BASE 
      /\ 
      / \ 
     Deriv1 Deriv2 
      \ /
      \/
      Final 

我已經爲每個類「ShowXXXXX」方法(例如),其中'XXXX'是類的名稱。

當我打電話 「ob.ShowFinal()」 的方法將打印:

  • 最終的領域,
  • DERIV1的領域,
  • 基地的領域,
  • Deriv2的領域,
  • 基地的領域

該pro瑕疵是,我想第二次逃脫印刷基地的領域。 但是,有一個範例:原因時,我稱之爲「ob.ShowDeriv2()」應該印:

  • Deriv2的領域,
  • 基地的領域

,當我稱之爲「ob.ShowDeriv1()」它應該是印刷:

  • DERIV1的字段,
  • 基地的字段

我的代碼:

// multipleInheritance.cpp : Defines the entry point for the console application. 
// 

//Summary: 
//  
//  Mmb - member 
//  Prm - parameter 
//  b - Base 
//  i1, i2 - Intermediate1, Intermediate2 
//  f - final 

class Base 
{ 
    int bMmb; 

public: 
    Base(int); 
    void ShowBase(); 
}; 

Base::Base (int bPrm) 
{ 
    bMmb = bPrm; 
} 

void Base::ShowBase() 
{ 
    cout << "Showing Base fields" << endl; 
    cout << "bMmb = " << bMmb << endl; 
    cout << "----------------------------" << endl << endl; 
} 

class Intermediate1 : public Base 
{ 
    int i1Mmb; 

public: 
    Intermediate1(int, int); 
    void ShowIntermediate1(); 
}; 

Intermediate1::Intermediate1(int bPrm, int i1Prm):Base(bPrm) 
{ 
    i1Mmb = i1Prm; 
} 

void Intermediate1::ShowIntermediate1() 
{ 
    cout << "Showing Intermediate1 fields" << endl; 
    cout << "i1Mmb = " << i1Mmb << endl; 
    ShowBase(); 
} 

class Intermediate2 : public Base 
{ 
    int i2Mmb; 

public: 
    Intermediate2(int, int); 
    void ShowIntermediate2(); 
}; 

Intermediate2::Intermediate2(int bPrm, int i2Prm):Base(bPrm) 
{ 
    i2Mmb = i2Prm; 
} 

void Intermediate2::ShowIntermediate2() 
{ 
    cout << "Showing Intermediate2 fields" << endl; 
    cout << "i2Mmb = " << i2Mmb << endl; 
    ShowBase(); 
} 

class Final : public Intermediate1, public Intermediate2 
{ 
    int fMmb; 

public: 
    Final(int, int, int, int); 
    void ShowFinal(); 
}; 

Final::Final(int bPrm, int i1Prm, int i2Prm, int fPrm): Intermediate1(bPrm, i1Prm), Intermediate2(bPrm, i2Prm) 
{ 
    fMmb = fPrm; 
} 

void Final::ShowFinal() 
{ 
    cout << "Showing Final fields" << endl; 
    cout << "fMmb = " << fMmb << endl; 
    ShowIntermediate1(); 
    ShowIntermediate2(); 
} 

void main() 
{ 
    Base t(1); 
    t.ShowBase(); 

    Intermediate1 u1(2, 31); 
    u1.ShowIntermediate1(); 

    Intermediate2 u2(4, 51); 
    u2.ShowIntermediate2(); 

    Final v(6, 71, 72, 8); 
    v.ShowFinal(); 
} 

感謝您的幫助!

+0

您可以使用虛擬繼承來確保'Final'只有一個'BASE'子對象,而非兩個非虛擬繼承的情況。但虛擬繼承確實有成本 - 它增加了「Deriv1」和「Deriv2」子對象的大小,使用起來更加複雜。我不禁思考,但你的設計有一個更基本的問題。你究竟在做什麼?所有的'Show *()'方法都只是用於調試或者什麼? –

+0

當你應該使用構圖時,它有點像你正在使用繼承。你能解釋一下你想用這些代碼解決什麼問題嗎? –

+0

我應該做一個由我的教授在實驗室培訓課程上提出的工作。這是一個簡單的例子,他說:「嘗試在長菱形下進行多重繼承」 – meorfi

回答

1

在你的問題中有很少的約束,所以這應該工作。

變化Intermediate1聲明(2)以

public: 
    void ShowIntermediate1(bool printBase = true); 

並在實施:

... 
if (printBase) 
ShowBase(); 

然後在ShowFinal()

ShowIntermediate1(true); 
ShowIntermediate2(false);