У меня есть 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();
}
Спасибо за помощь!
Вы должны использовать виртуальное наследование, чтобы гарантировать, что 'Final' получает только один подобъект BASE, а не два в случае не виртуального наследования. Но виртуальное наследование действительно имеет стоимость - оно увеличивает размер подэлементов 'Deriv1' и' Deriv2', и это несколько сложнее в использовании. И я не могу не думать, но есть более фундаментальная проблема с вашим дизайном. Что вы на самом деле пытаетесь сделать? Все методы 'Show *()' существуют только для отладки или что? –
Это немного пахнет, как вы используете наследование, когда вы должны использовать композицию. Можете ли вы объяснить, какую проблему вы пытаетесь решить с помощью этого кода? –
Я должен сделать работу, предложенную моим профессором на лабораторных учебных курсах. Это простой пример, где он сказал: «Попробуйте сделать множественное наследование под ромбоидальной формой» – meorfi