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

1 ... 50 51 52 [ 53 ] 54 55 56 ... 159


window

window w caption

window

window w scroIl

window w caption and scroll


window w caption and scroll

Puc. 4.4. Примеры невиртуального (a) и виртуального (б) базового класса

window

6 в. А. Скляров



В() { cout B\t ; } конструктор ~В{) { cout -B\t ; } деструктор void fb() { cout \nfb ; }

class B1 : public В {

int b1; public:

B1(int bb1) : b1(bb1) { cout B1\t ; } конструктор ~B1{) { cout -B1\t ; } деструктор

void fb1() { cout \nfb1 ; }

class B2 : public В {

int b2; public:

B2{int bb2) : b2(bb2) { cout B2\t ; } конструктор ~B2() { cout -B2\t ; } деструктор

void fb2() { cout \nfb2 ; }

class D : public B2, public Bl { множественное

наследование для D

int d; public:

D(int dd,int bb1,int bb2) : d(dd),B1(bb1),B2(bb2)

{ cout D\t ; } конструктор . ~D{) { cout -D\t ; } деструктор

void fd() { cout \nfd ; }

void main{void)

{ D od(1,2,3),*pd; Последовательность зызова

конструкторов: В В2 В Bl D

pd=&od;

pd->fb1(); Результат: fbl

od.fb1{); Результат: fb1

pd->fb2(); Результат: fb2

od.fb20; Результат: fb2



pd->fd(); Результат: fd

od.fdO; Результат: fd

cout endl;

pd->fb(); ошибка - member is ambiguous B::fb and B::fb

od.fbO; ошибка - member is ambiguous B::fb and B::fb ) Последовательность вызова

деструкторов: -D -Bl -В -В2 -В

Второй пример во многом повторяет первый, но объявляет класс В виртуальным (см. рис. 4.4,6, на котором показано, как изменяется при этом диаграмма наследования классов). Здесь следует обратить внимание на то, что при конструировании объекта класса D строится только один подобъект класса В. Кроме того, теперь нет неоднозначности (и, соответственно, ошибок) при вызове функции fbQ.

#include <(ostream.h>

class В {

public:

В() { cout B\t ; } ~B() { cout -B\t ; } void fb() { cout \nfb ; }

class Bl : virtual public В { базовый класс В является

виртуальным

int Ы; public:

B1(int ЬЫ) : Ы(ЬЫ) { cout B1\t ; } ~В10 { cout -B1\t ; } void fblQ { cout \nfb1 ; }

class B2 : virtual public В { базовый класс В является

виртуальным

int Ь2; public:

B2(int ЬЬ2) : Ь2(ЬЬ2) { cout B2\t ; } ~В2() { cout -B2\t ; }



1 ... 50 51 52 [ 53 ] 54 55 56 ... 159

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