Особенности наследования классов в C++
Информация - Компьютеры, программирование
Другие материалы по предмету Компьютеры, программирование
Содержание
Введение
. Абстрактные классы
. Множественное наследование
. Адреса базовых классов
. Виртуальное наследование
Заключение
Список литературы
Введение
Цель объектно-ориентированного программирования состоит в повторном использовании созданных вами классов, что экономит ваше время и силы. Если вы уже создали некоторый класс, то возможны ситуации, что новому классу нужны многие или даже все особенности уже существующего класса, и необходимо добавить один или несколько элементов данных или функций. В таких случаях C++ позволяет вам строить новый объект, используя характеристики уже существующего объекта. Другими словами, новый объект будет наследовать элементы существующего класса (называемого базовым классом). Когда вы строите новый класс из существующего, этот новый класс часто называется производным классом. В этом уроке впервые вводится наследование классов в C++.
Ели ваши программы используют наследование, то для порождения нового класса необходим базовый класс, т.е. новый класс наследует элементы базового класса.
Для инициализации элементов производного класса ваша программа должна вызвать конструкторы базового и производного классов. Используя оператор точку, программы могут легко обращаться к элементам базового и производного классов.
Для разрешения конфликта имен между элементами базового и производного классов ваша программа может использовать оператор глобального разрешения, указывая перед ним имя базового или производного класса.
Наследование является фундаментальной концепцией объектно-ориентированного программирования. Выберите время для экспериментов с программами, представленными в этом уроке. И вы обнаружите, что реально наследование реализуется очень просто и может сохранить огромные усилия, затрачиваемые на программирование.
1. Абстрактные классы
Абстрактным называется класс, который содержит как минимум одну чистую виртуальную компонентную функцию. Чистая виртуальная функция - это виртуальная функция, для которой программист не планирует в текущей версии программы иметь каких-либо реализаций. Объявление такой функции может иметь, например, следующий вид:
Employee { // Класс Служащий:name[40]; // Имя служащего:(char* n);
//Чистая виртуальная функцияvoid* promote()=0;
Абстрактный класс не может быть реализован в объекте. Так, следующая строка:
s("My name");
вызовет ошибку, о которой сообщит компилятор.
Однако программа может объявить указатель абстрактного класса, так что следующая строка вполне допустима:
* sPtr;
Компоненты абстрактного класса могут наследоваться. Если все чистые виртуальные методы класса перегружены правилами, не являющимися чистыми и виртуальными, класс может не являться абстрактным. В следующем примере класс Secretary может быть реализован объектом, поскольку функция promote была перегружена и имеет теперь другой смысл.
Secretary: public Employee {:moreData;:(char* n): Employee(n) { }void* promote();
};sec("Another Name");
Адрес объекта Secretary может быть передан в функцию, которая ожидает передачи Employee:
fn(Employee*);sec("Another Name");(&sec);
Абстрактные классы полезны для организации иерархической структуры классов. Например, может быть известно, что все служащие должны принадлежать к подклассу Employee. Поскольку разные служащие имеют разные циклы продвижения по службе (promotion), каждый подкласс должен иметь собственный метод promote(). Объявив promote() как чистую виртуальную функцию, разработчик класса Employee требует тем самым, чтобы разработчик подкласса написал метод promote() до реализации любого производного класса от Employee.
2. Множественное наследование
Наследование представляет собой способность производного класса наследовать характеристики существующего базового класса. Простыми словами это означает, что, если у вас есть класс, чьи элементы данных или функции-элементы могут быть использованы новым классом, вы можете построить этот новый класс в терминах существующего (или базового) класса. Новый класс в свою очередь будет наследовать элементы (характеристики) существующего класса. Использование наследования для построения новых классов сэкономит вам значительное время и силы на программирование. Объектно-ориентированное программирование широко использует наследование, позволяя вашей программе строить сложные объекты из небольших легко управляемых объектов.
В C++ класс может наследовать свойства более чем одного класса. Формат определения наследования классом свойств нескольких базовых классов аналогичен формату определения наследования свойств отдельного класса. Приведем пример.
SubClass: public Base1, private Base2 {
// остальная часть определения класса
}
В определении может быть перечислено любое число базовых классов через запятую. Ни один базовый класс не может быть прямо унаследован более одного раза. Каждый базовый класс может быть унаследован как public или как private; умолчанием является private.
Когда класс мог наследовать свойства только одного единственного класса, последовательность выполнения конструкторов не являлась жестко заданной. С переходом к множественному наследованию порядок выполнения конструкторов становится очень важен. Этот порядок вызова следующий:
(1) конструкторы всех виртуальных базовых классов; если их имеется более одного, то конструкторы вызываютс?/p>