Парадигма множественного наследования C ++ (ромбовидная схема) - PullRequest
0 голосов
/ 22 ноября 2011

У меня 4 класса, организованных по ромбовидной схеме множественного наследования.

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

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

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

  • поля Финала,
  • поля Deriv1,
  • Поля базы,
  • поля Deriv2,
  • Поля базы

Проблема в том, что я хочу избежать печати полей 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();
}

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

В вашем вопросе очень мало ограничений, поэтому это должно сработать.

Измените объявление в Intermediate1 (и 2) на

public:
    void ShowIntermediate1(bool printBase = true);

И в реализации:

...
if (printBase)
 ShowBase();

Затем в ShowFinal():

ShowIntermediate1(true);
ShowIntermediate2(false);
0 голосов
/ 22 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...