Программирование >>  Расширенная версия языка c++ 

1 ... 70 71 72 [ 73 ] 74 75 76 ... 227


Глава 7 едование 221.

Ь = х;

in Ь() t return Ь; }

Прямое наследование производного класса и косвенное наследование базового класса class D2: public Dl {

int с,-public:

D2 (int x, int y, int z) : Dl{y, z) передача аргументов

классу Dl -i!

{

с = x;

/* Поскольку ОБЫе классы наслеются как открытые, класс D2 имеет

доступ к открыт элементам классов В1 и Dl */

void show ( ) {

cou getb() (мм.с

cou< с \п ; i: i -

int main ( )

D2 ob(l, 2, 3); ~ :

ob.show();

функции a() M ) здесь тоже открыты г.

cout ob.getaO ob.getbi. \n; .

return 0;

Вызов функции выводит на экран значения 3 2 1. В этом примере

класс В1 является косвенным базовым классом для класса D2. Отметьте, что класс D2 имеет доступ к открытым членам классов D1 и В1. Как вы уже должны знать, при наследовании открытых членов базового класса они становятся открытыми членами производного класса. Поэтому, если класс D1 наследует класс В1, то функция geta() становится открытым членом класса D1 и затем открытым членом класса D2.

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



Перед тем как двигаться дальше, необходимо небольшое замечание о стиле изображения графов наследования в C++. Обратите внимание на то, что в предыдущем графе стрелки направлены не вниз, а вверх.

Традиционно программисты C++ изображают отношения наследования в виде прямых графов, стрелки которых направлены от производного к базовому классу. Хотя новички могут посчитать такой подход излишне схематичным, именно он обычно практикуется в C++.

2. Здесь представлена переработанная версия предыдущей программы, в которой производный класс прямо наследует два базовых класса:

#include <iostreani>

using namespace std;

Создание первого базового класса : -.

class Bl {

int a; . .

public:

BKint x) { a = x; } ,f.--

int geta() { return a; } .

Создание второго базового класса class B2 {

int b;

public: . . .

B2 (int X) jjk: . . , ... , . . -

f .... , ,

b = x;

in b() { return b; } f . ... :

Прямое наследование двух базовых классов . - . , .

class D: public Bl, public B2 {

int c;

Здесь показана иерархия классов предыдущей программы: В1



public:

здесь переменные z и у

напрямую передаются классам В1 и В2

D{in, int у/ int z) : Bl(z), В2(у}

/* Поскольку базовые классы наследуются как открытые, класс D имеет доступ к открытым элементам классов В1 и В2

cou а{) cou << с \п;

getb(<

int mainO

D ob(l, 2, 3) ; ob. showO ; return 0;

В этой версии программы класс D передает аргументы по отдельности классам В1 и В2. Теперь иерархия классов выглядит таким образом:

В1 t

3. В следующей программе показан порядок, в котором вызываются конструкторы и деструкторы, когда производный класс прямо наследует несколько базовых классов:

finclude <iostreain> :.

using namespace std;

class Bl { ...

public:

BIO { cou Работа конструктора класса n ; } ,i

~B10 { cou Работа деструктора класса \n ; }



1 ... 70 71 72 [ 73 ] 74 75 76 ... 227

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.003
При копировании материалов приветствуются ссылки.
Яндекс.Метрика