Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Глава 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; Просмотров: 183; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.007 с.)
Главная | Случайная страница | Обратная связь