Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 9 лет назад пользователемГалина Галецкая
1 Лекция 13 Производные классы и открытое наследование. Подбельский гл , Страуструп гл , Мейрс пп Открытое наследование производного класса Derived базовому классу Base означает, что производный класс Derived является разновидностью базового класса Base. Класс Derived кроме своих собственных членов содержит члены класса Base. Там, где может быть использован объект класса Base, может быть использован и объект класса Derived. Но не наоборот. Base Derived Производный класс ссылается на базовый. Синтаксис открытого наследования: class Derived : public Base {/* Определение производного класса */}; При открытом наследовании: Данные-члены и функции-члены базового класса, которые имели в нем статус доступа public, в производном классе также будут иметь статус public. Данные-члены и функции-члены базового класса, которые имели в нем статус доступа protected, в производном классе также будут иметь статус protected. Статус protected означает, что доступ к этому члену (функции или данному) класса имеют только имеют только функции этого класса (аналогично private ) или производных от него.
2 Пример 13: Класс Stbl, производный от класса Tbl, с улучшенной обработкой пробелов. Tbl Stbl Сначала слегка изменим базовый класс. Добавим в него защищенную функцию-член, которая возвращает указатель на строку в памяти Пример 13.0 Файл tbl.h, содержит определение класса Tbl (фрагмент): class Tbl { public: //... int length() const {return len;} virtual int numsym() const {return len;} protected: const char* get_name() const {return name;} private: static int N; char *name; int sz, len; };
3 #include "tbl.h" // Не забудем включить определение класса Tbl class Stbl : public Tbl { public: Stbl(const Tbl&); // Конструктор, создающий объект производного класса по // объекту базового класса Stbl& operator+=(const Stbl&); int get_nums() const {return num_spaces;} virtual int numsym () const; private: void count_space(); // Функция подсчета числа пробелов int num_spaces; }; Пример 13.1 Файл stbl.h, содержит определение класса Stbl : Пример 13.2 Файл stbl.cpp, содержит определения функций членов класса Stbl : #include "stbl.h" Stbl::Stbl(const Tbl& t) : Tbl(t), // Инициализация базового класса - вызов Tbl(const Tbl &) num_spaces(0) // Инициализация своих (производного класса) членов { count_space(); } Объекты производного класса создаются в следующем порядке: сначала базовый класс, потом члены, потом сам производный класс. А уничтожаются в обратном порядке.
4
Пример 13.2 Файл stbl.cpp, продолжение : void Stbl::count_space() { num_spaces=0; const char *s=this->get_name(); // вызов защищенной функции из базового класса for (int i=0; i
5
Пример 13.3 Файл main.cpp, содержит функцию main() - использование объектов классов Stbl и Tbl : #include #include "tbl.h" #include "stbl.h" int Tbl::N=0; int main() { Tbl t1(" Game "); Stbl t2(" over ! "); // Сначала будет вызван к. Tbl(const char*), // а затем к. Stbl(const Tbl&) cout<<"t1:"<
6
t1: N== 2 SZ==7 LEN==6 NAME==" Game "470f80 t2: N== 2 SZ==9 LEN==8 NAME==" over ! "470fe0 # spaces==3 t3: N== 3 SZ==9 LEN==8 NAME==" over ! "470fb0 # spaces==3 t4: N== 4 SZ==13 LEN==12 NAME=="F i n i s h."470ba0 # spaces==5 t3: N== 4 SZ==13 LEN==12 NAME=="F i n i s h."470db0 # spaces==5 t3: N== 4 SZ==21 LEN==20 NAME==" over ! F i n i s h."470e80 # spaces==8 t1: N== 4 SZ==21 LEN==20 NAME==" over ! F i n i s h."470f70 t4: N== 4 SZ==21 LEN==20 NAME==" over ! F i n i s h."470ba0 # spaces==8 t2: N== 4 SZ==29 LEN==28 NAME==" over ! over ! F i n i s h." # spaces==11 Stbl::numsym()==17 Tbl::numsym()==20 Пример 13.3 Файл main.cpp, продолжение. t1=t3; cout<<"t1:"<
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.