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

1 ... 44 45 46 [ 47 ] 48 49 50 ... 159


В DES А DES В DES А DBS А DES

Вторая программа показывает передачу параметров в конструкторы производных классов для иерархической структуры классов вида: А<-В<-С.

#include <iostream.h>

class А { базовый класс

int а; public:

A(int v) : a(v) {} конструктор void pr() { cout a endl; }

class В : public A { производный и он же базовый класс

int b; public:

B(int vA.int vB) : A(vA), b(vB) {} конструктор void pr() { cout b endl; }

class С : public В { производный класс

int с; public:

C(int vA,int vB.int vC) : B(vA,vB), c(vC) {} конструктор void pr{) { cout << с << endl; }

void main(void) { Aaa(IO), *pa;

В bb{10,100);

Ccc{10,100,1000);

aa.pr(); Результат: 10

bb.prO; Результат: 100

cc.pr(); Результат: 1000

pa=&bb;



ра->рг{); Результат: 10

ра=&сс;

ра->рг{); Результат: 10

В заключение перечислим основные правила конструирования базовых и производных классов:

♦ если базовый класс Б имеет конструктор, и Б <- П, где П- производный класс, то конструктор класса Б должен быть вызван при построении производного класса П;

♦ если конструктор Б имеет аргументы, то их значения должны быть переданы через дополнительные аргументы конструктора класса П;

объекты базовых и производных классов конструируются в следующем порядке: сначала базовые объекты и, возможно, компоненты в порядке их объявления; затем объект производного класса. Разрушение всех этих объектов осуществляется в обратном порядке.

4.3. Виртуальные функции

Основная идея виртуальных функций заключается в следующем. Виртуальная функция может быть объявлена в базовом классе и затем переопределена в каждом производном классе. После этого доступ через указатель на объект базового класса осуществляется к этой функции для базового класса, а доступ через указатель на объект производного класса осуществляется к этой функции для производного класса. Рассмотрим пример:

class book { char* title;

public:

book(char* book title, int book publishing year); virtual void display(void);

..................... };

class programmers guide : public book {



char* programming language used; public:

programmers guide(char*,char* ,int); void display(void);

..................... };

void book::display{void)

{ cout title endl; }

void programmers guide::display(void)

{ book::display();

cout programming language used endl;

Теперь программа void main(void)

{ book b( Oxford Advanced Learners Dictionary ,1994), *pointer;

programmers guide pg( ObjectWindows for C++ ,

EnglishM993); pointer = &b; pointer -> displayO; pointer = &pg;

pointer -> displayO; }

выведет на экран следующую информацию:

Oxford Advanced Learners Dictionary

ObjectWindows for C++

English Объявление:

virtual void display(void);

говорит о том, что функция display может быть различной для базового и разных производных классов. Компилятор должен найти правильную версию функции display при каждом ее вызове. Тип функции не может быть переопределен в производных классах (одно исключение из этого правила рассмотрено в конце параграфа). Кроме специального, рассматриваемого ниже, типа виртуальных функций (pure virtual functions) эти функции должны быть обязательно описаны в классе, в кото-



1 ... 44 45 46 [ 47 ] 48 49 50 ... 159

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