Лекция 13 Производные классы и открытое наследование. Подбельский гл. 10.1-2, Страуструп гл. 12.1-2, Мейрс пп. 35-37. Открытое наследование производного.

Презентация:



Advertisements
Похожие презентации
Лекция 10 Класс как абстрактный тип. Подбельский гл. 9, Страуструп гл. Конструкторы и деструктор Конструкторы - это специальные функции-члены класса, предназначенные.
Advertisements

Лекция 12 Перегрузка операторов. Часть 2. Подбельский гл. 9.7, Страуструп гл. 11, Мейрс п. 11,15-17,19. Перегрузка копирующего конструктора T(const T&)
Наследование Полиморфизм ВЫЗОВ КОНСТРУКТОРОВ И ДЕСТРУКТОРОВ ПРИ НАСЛЕДОВАНИИ.
Лекция 4. Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции.
Статические поля класса Статические поля хранят данные, общие для всех элементов класса. Статическое поле существует в единственном экземпляре для всех.
Лекция 13. Введение в ООП. Часть 4 Красс Александр СПбГУ ИТМО, 2008.
НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.
Прикладное программирование кафедра прикладной и компьютерной оптики Наследование.
Синтаксис языка Java. Символы и синтаксис Перевод строчки эквивалентен пробелу Регистр в именах различается.
1. Классы ООП 1.Наследование 2.Инкапсуляция 3.Полиморфизм.
Производные классы Определение класса посредством добавления возможностей к уже имеющемуся классу без перепрограммирования или перекомпиляции самого класса.
Множественное наследование class A {... }; class B {... }; class C : public A, protected B {... }; !!! Спецификатор доступа распространяется только на.
Лекция 31. Динамическая информация о типе Красс Александр СПбГУ ИТМО, 2009.
Дружественные функции Дружественные функции – это функции, объявленные вне класса, но имеющие доступ к закрытым и защищенным полям данного класса Дружественная.
1 Переопределение операций Макаревич Л. Г.. 2 Зачем нужна перегрузка операций? class Complex { double re; double im; public: Complex(double r=0, double.
2. Классы.Полиморфизм.. Перегрузка функций void f(); void f(int value); void f(doublevalue); void f(int value, int nextValue); … f(); f(12); f(12.0);
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Лекция 10 ОбъектыЛекция 10 ОбъектыООП Инкапсуляция Возможность совместного хранения данных и кода для их обработки Наследование Возможность расширять существующие.
Лекция 8. Введение в ООП. Часть 1 Красс Александр СПбГУ ИТМО, 2008.
Транксрипт:

Лекция 13 Производные классы и открытое наследование. Подбельский гл , Страуструп гл , Мейрс пп Открытое наследование производного класса Derived базовому классу Base означает, что производный класс Derived является разновидностью базового класса Base. Класс Derived кроме своих собственных членов содержит члены класса Base. Там, где может быть использован объект класса Base, может быть использован и объект класса Derived. Но не наоборот. Base Derived Производный класс ссылается на базовый. Синтаксис открытого наследования: class Derived : public Base {/* Определение производного класса */}; При открытом наследовании: Данные-члены и функции-члены базового класса, которые имели в нем статус доступа public, в производном классе также будут иметь статус public. Данные-члены и функции-члены базового класса, которые имели в нем статус доступа protected, в производном классе также будут иметь статус protected. Статус protected означает, что доступ к этому члену (функции или данному) класса имеют только имеют только функции этого класса (аналогично private ) или производных от него.

Пример 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; };

#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(); } Объекты производного класса создаются в следующем порядке: сначала базовый класс, потом члены, потом сам производный класс. А уничтожаются в обратном порядке.

Пример 13.2 Файл stbl.cpp, продолжение : void Stbl::count_space() { num_spaces=0; const char *s=this->get_name(); // вызов защищенной функции из базового класса for (int i=0; i<length(); i++) if (isspace(s[i])) num_spaces++; } Stbl& Stbl::operator+=(const Stbl& t) {// перегрузка оператора += Tbl::operator+=(t); // вызов о.ф. из базового класса // которая делает всю трудную работу count_space(); //а мы только считаем деньги return *this; } int Stbl::numsym() const {// Определение виртуальной ф-ции, которая возвращает int num=0; // количество символов в строке, отличных от пробела. const char *s=get_name(); for (int i=0; i<length(); i++) if (!isspace(s[i])) num++; return num; }

Пример 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:"<<t1<<"\n" <<"t2:"<<t2<<"# spaces=="<<t2.get_nums()<<endl; Stbl t3=t2; // через к.к. базового класса cout<<"t3:"<<t3<<"# spaces=="<<t3.get_nums()<<endl; Stbl t4("F i n i s h."); cout<<"t4:"<<t4<<"# spaces=="<<t4.get_nums()<<endl; t3=t4; // через operator=() базового класса cout<<"t3:"<<t3<<"# spaces=="<<t3.get_nums()<<endl; t3=t2+t4; // " over! " + "F i n i s h." cout<<"t3:"<<t3<<"# spaces=="<<t3.get_nums()<<endl;

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:"<<t1<<"\n"; t4=t1; cout<<"t4:"<<t4<<"# spaces=="<<t4.get_nums()<<endl; t2+=t1; // Сначала будет вызван к. Stbl(const Tbl&) // затем Stbl::operator+=() cout<<"t2:"<<t2<<"# spaces=="<<t2.get_nums()<<endl; cout<<"Stbl::numsym()=="<<t2.numsym()<<"\n" <<" Tbl::numsym()=="<<t1.numsym()<<endl; // Для объектов производного и базового класса будет вызвана своя ф-ция numsym() return 0; } Пример 13 Будет напечатано: