Освой самостоятельно С++ за 21 день.
Шрифт:
Пример 1:
class Pegasus : public Horse, public Bird
Пример 2:
class Schnoodle : public Schnauzer, public Poodle
Из каких частей состоят объекты, полученные в результате множественного наследования
Когда в памяти компьютера создается объект Pegasus, конструкторы обоих классов принимают
Рис. 13.1. Объект, полученный в результате множественного наследования
В случае использования множественного наследования возникает ряд непростых и весьма интересных вопросов. Например, что произойдет, если оба базовых класса будут иметь одно и то же имя либо содержать виртуальные функции или данные с одинаковыми именами? Как инициализируются конструкторы разных базовых классов? Что произойдет, если два базовых класса будут произведены от одного и того же родительского класса? Все эти вопросы будут рассмотрены в следующем разделе, после чего можно переходить к практическому использованию множественного наследования.
Конструкторы классов, полученных в результате множественного наследования
Если класс Pegasus производится от двух базовых классов — Bird и Horse, а в каждом из них объявлены конструкторы со списками параметров, то класс Pegasus инициализирует эти конструкторы. Как это происходит, показано в листинге 13.4.
Листинг 13.4. Создание объектов при множественном наследовании
1: // Листинг 13.4.
2: // Создание обьектов при множественном наследовании
3: #include <iostream.h>
4: typedef int HANDS;
5: enum COLOR { Red, Green, Blue, Yellow, White, Black, Brown };
6:
7: class Horse
8: {
9: public:
10: Horse(COLOR color, HANDS height);
11: virtual ~Horse { cout << "Horse destructor...\n"; }
12: virtual void Whinnyconst { cout << "Whinny!... "; }
13: virtual HANDS GetHeight const { return itsHeight; }
14: virtual COLOR GetColor const { return itsColor; }
15: private:
16: HANDS itsHeight;
17: COLOR itsColor;
18: };
19:
20: Horse::Horse(COLOR color, HANDSheight):
21: itsColor(color),itsHeight(height)
22: {
23: cout << "Horse constructor...\n";
24: }
25:
26: class Bird
27: {
28: public:
29: Bird(COLOR color, bool migrates);
30: virtual ~Bird { cout << "Bird destructor...\n"; }
31: virtual void Chirpconst { cout << "Chirp... "; }
32: virtual void Flyconst
33: {
34: cout << "I can fly! I can fly! I can fly! ";
35: }
36: virtual COLOR GetColorconst { return itsColor; }
37: virtual bool GetMigration const { return itsMigration; }
38:
39: private:
40: COLOR itsColor;
41: bool itsMigration;
42: };
43:
44: Bird::Bird(COLOR color, bool migrates):
45: itsColor(color), itsMigration(migrates)
46: {
47: cout << "Bird constructor...\n";
48: }
49:
50: class Pegasus : public Horse, public Bird
51: {
52: public:
53: void Chirpconst { Whinny; }
54: Pegasus(COLOR, HANDS, bool,long);
55: ~Pegasus { cout << "Pegasus destructor...\n";}
56: virtual long GetNumberBelievers const
57: {
58: return itsNumberBelievers;
59: }
60:
61: private:
62: long itsNumberBelievers;
63: };
64:
65: Pegasus::Pegasus(
66: COLOR aColor,
67: HANDS height,
68: bool migrates,
69: long NumBelieve):
70: Horse(aColor, height),
71: Bird(aColor, migrates),
72: itsNumberBelievers(NumBelieve)
73: {
74: cout << "Pegasus constructor...\n";
75: }
76:
77: int main
78: {
79: Pegasus *pPeg = new Pegasus(Red, 5, true, 10);
80: pPeg->Fly;
81: pPeg->Whinny;
82: cout << "\nYour Pegasus is " << pPeg->GetHeight;
83: cout << " hands tall and ";
84: if (pPeg->GetMigration)
85: cout << "it does migrate.";
86: else
87: cout << "it does not migrate.";
88: cout << "\nA total of " << pPeg->GetNumberBelievers;
89: cout << " people believe it exists.\n";
90: delete pPeg;
91: return 0;
92: }
Результат:
Horse constructor...
Bird constructor...
Pegasus constructor...
I can fly! I can fly! I can fly! Whinny!...
Your Pegasus is 5 hands tall and it does migrate.
A total of 10 people believe it exists.
Pegasus destructor...
Bird destructor...
Horse destructor...
Анализ: