Конструкторы и производные классы — КиберПедия 

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Конструкторы и производные классы

2021-12-07 33
Конструкторы и производные классы 0.00 из 5.00 0 оценок
Заказать работу

Обычно при создании объекта производного класса требуется инициализировать данные не только производного, но и базового классов. Для этого в конструкторе производного класса надо явно вызвать конструктор базового класса и передать ему необходимые параметры. Рассмотрим этот вопрос на примере классов Men и MenEx, из которых уберем функции Set () и Print () и добавим конструкторы-инициализаторы:

class Men{

char* name;

int age;

public:

Men(char* n, int a){name=n; age=a;}

};

class MenEx:public Men{

int wages;

public:

MenEx(char* n,int a,int w):Men(n,a){

wages=w;

}

};

В конструкторе производного класса перечисляются в качестве параметров все переменные как производного, так и базового классов. В соответствии с правилами написания заголовка функции все параметры предваряются их типами. После двоеточия указывается имя конструктора базового класса с перечнем его параметров. Здесь типы переменных уже не указываются. В теле конструктора производного класса осуществляется обычная инициализация его данных. При вызове конструктора производного класса (с целью создания комбинированного объекта, включающего члены обоих классов) необходимо, в соответствии с его описанием, передать ему три аргумента:

MenEx m(”Краснов”, 44, 12000);

Первые два аргумента (”Краснов” и 44) преобразуются в параметры n и a будут переданы конструктору класса Men, в котором они инициализируют данные-члены класса name и age. Третий аргумент (12000) поступит в параметр w и будет использован в конструкторе производного класса для присвоения значения переменной wages, входящей в класс MenEx.

Как известно, параметры любых функций в языке С++ позиционные. Вызывая функцию, мы должны передавать ей фактические аргументы в том порядке, в каком они указаны в ее определении. Поэтому и в конструкторе класса MenEx параметры класса Men следует перечислять в том порядке, в каком они указаны в конструкторе (уже имеющемся) класса Men. Таким образом, при разработке производного класса необходимо знать, как выглядит прототип конструктора базового класса.

Мы рассмотрели формат встроенного конструктора производного класса, когда и вызов базового конструктора, и тело производного включаются в его объявление. Для невстроенного конструктора вызов конструктора базового класса осуществляется не в прототипе, а в определении конструктора производного класса:

MenEx(char*,int,int);// Прототип конструктора

MenEx(char* n,int a,int w):Men(n,a){wages=w;}// Определение

Виртуальные функции

Понятие виртуальной функции

В разделе 3 мы уже столкнулись с понятием полиморфизма, когда описывали перегруженные функции, т. е. функции с одним именем, но с различающимися списками параметров. Настоящий раздел будет посвящен другой форме полиморфизма, реализуемой в виртуальных функциях. Виртуальные функции тоже имеют одно имя, но различаются они не по сигнатурам, как в случае перегруженных функций, а по тому, в каком именно классе (из некоторой иерархии классов) они определены. Виртуальные функции замечательны тем, что выбор требуемой из множества виртуальных функций с одним именем осуществляется не во время компиляции программы, а динамически, в процессе выполнения программы, по конкретному значению указателя, посредством которого эта функция вызывается.

Виртуальная функция объявляется в базовом классе с помощью ключевого слова virtual и затем обязательно замещается по крайней мере в одном производном классе. При этом не только имя, но и типы параметров, а также тип возвращаемого значения для замещаемых функций должны быть такими же, как для “исходной” функции, объявленной в базовом классе. В производных классах объявления этих замещенных функций могут для наглядности содержать описатель virtual, но это не обязательно; если функция объявлена виртуальной в базовом классе, то все замещающие ее функции в производных классах автоматически становятся виртуальными.

Виртуальные функции проявляют свойство виртуальности только в том случае, если они вызываются через указатель или ссылку на базовый класс. Как будет показано ниже, указатель на базовый класс может принимать конкретное значение указателя на производный класс; если этот указатель к моменту вызова функции фактически указывает на объект базового класса, вызывается вариант функции из базового класса; если же указатель фактически указывает на некоторый объект производного класса, вызывается вариант функции из этого производного класса.


Поделиться с друзьями:

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.007 с.