Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Глава 21. Наследование классов 229
sor. Однако вы можете сказать, что СОДЕРЖИТ Advisor. Какая разница между этим отношением и наследованием? Используем в качестве примера автомобиль. Вы можете логически определить ав- томобиль, как подкласс транспортных средств, а значит, он будет наследовать свойст- ва остальных транспортных средств. С другой стороны, автомобиль содержит мотор. Если вы покупаете автомобиль, то покупаете и мотор (если, конечно, вы не покупаете бывшую в употреблении машину там же, где я купил свою кучу металлолома). Если друзья пригласят вас приехать на воскресный пикник на новой машине и вы приедете на ней, никто не будет удивлен (даже если вы явитесь на мотоцикле), по- скольку автомобиль ЯВЛЯЕТСЯ транспортным средством. Но если вы появитесь на своих двоих, неся в руках мотор, друзья решат, что вы попросту издеваетесь над ни- ми, поскольку мотор не является транспортным средством, так как не имеет некото- рых важных свойств, присущих транспортным средствам. В аспекте программирования связь типа СОДЕРЖИТ достаточно очевидна. Разбе- рем следующий пример: class Vehicle
class Motor f }; class Car : { Motor motor;
void v); void raotorFn(Motors nt ma ! Car c;
return 0; }
//так можно вызвать //а так нельзя //нужно вот так Вызов VehicleFn (с) допустим, поскольку с ЯВЛЯЕТСЯ Vehicle. Вызов motorFn (с) недопустим, поскольку с — не Motor, хотя он и содержит Motor. Если возникает необходимость передать функции только ту часть с, которая является мото- ром, это следует выразить явно: motorFn (с
Часть IV. Наследование Глава22 Знакомство с виртуальными функциями-членами: настоящие ли они Зачем нужен полиморфиз м Ка к работает полиморфиз м Полиморфно е приготовлени е закуски Когда функция не является виртуальной Виртуальные особенности
и тип аргументов функции включены в ее полное или, другими сло- вами, расширенное имя. Это позволяет создавать в одной программе функции с одним и тем же именем (если различаются их полные имена): void (char*) void (char* , double) Во всех трех случаях функции имеют одинаковое короткое имя . Полные имена всех трех функций различаются: отличается от (char*) и т.д. решает, какую именно функцию нужно вызвать, рассматривая полные имена слева направо. Тип возвращаемого значения не является частью полного имени функции, поэтому вы не можете иметь две функции с одинаковым расширенным отличающиеся только типом возвращаемого объекта.
Итак, функции-члены могут быть перегружены. При этом помимо количества и типов аргументов имя функции-члена содержит еше и имя класса. С появлением наследования возникает небольшая неувязка. Что, если член базового класса имеет то же имя, что и функция-член подкласса? Попробуем ра- зобраться с простым фрагментом кода: clas s S t ( public : // . . же, что и . .
class : public Student {
float () ; }; |
Последнее изменение этой страницы: 2019-04-19; Просмотров: 202; Нарушение авторского права страницы