|
Программирование >> Программирование на языке c++
В 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) эти функции должны быть обязательно описаны в классе, в кото-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |