2011-11-22 3 views
0

У меня есть 4 класса, организованных в соответствии с ромбоидальной схемой множественного наследования.Параллельная схема множественного наследования (ромбоидальная схема) C++

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

У меня есть для каждого класса «ShowXXXX()» методы (например), где «XXXX» является именем класса.

Когда я называю "ob.ShowFinal()" метод печатает:

  • поля Final в,
  • поля Deriv1 в,
  • поля Базы,
  • полей Deriv2 в,
  • поля Базы

Про blem - это то, что я хочу избежать печати полей Base второй раз. Но есть парадигма: причина, когда я называю «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); 
0

Может быть, ответ вы ищете для является virtual inheritance. Которая предназначена для решения diamond problem. Но вы должны изменить свой код, чтобы использовать виртуальные методы.

Смежные вопросы