Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
0495976_C19D7_shpory_s.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.82 Mб
Скачать

69. Приведите пример использования виртуальных функций

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

Если базовый класс base содержит (виртуальную) virtual

функцию vf, а производный класс derived также содержит

Язык программирования С++

141

функцию vf, то вызов vf для объекта класса derived вызывает

derived::vf.

Например:

struct base

{

virtual void vf ();

void f ();

};

struct derived : public base

{

void vf ();

void f ();

};

derived d;

base* bp = &d;

bp_>vf ();

bp_>f ();

Вызовы вызывают, соответственно, derived::vf и base::f для

объекта класса derived, именованного d. Так что интерпретация

вызова виртуальной функции зависит от типа объекта, для

которого она вызвана, в то время как интерпретация вызова

невиртуальной функции зависит только от типа указателя,

обозначающего объект.

70. Приведите пример использования вызова функций по значению и вызов по ссылке.

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

a = my.mymethod( myfunc( a, b + c ))

a = b->mystruct.mymethod( d )

Вызов функции по адресу

В переменной типа uint может храниться адрес (идентификатор) функции. Для вызова функции по ее идентификатору используется операция ->func и далее в скобках перечисляются параметры. В этом случае следует следить за количеством параметров и их типами, так как компилятор не может проверить совпадение параметров. Таким образом можно вызывать не только функции, но и методы и операторы.

a = &myfunc

a->func( c, d )

Ниже приведен пример , в котором используются: вызов функции в заголовке оператора for

int start() // Описание функции start()

{ // Начало тела ф-ии start()

int n; // Объявление переменной

int T=15; // Заданное время

for(int i=Func_yes_ret(T);i<=10;i++) // Использование функции в..

//.заголовке оператора цикла

{ // Начало тела цикла for

n=n+1; // Счётчик итераций

Alert ("Итерация n=",n," i=",i); // Оператор вызова функции

} // Конец тела цикла for

return; // Выход из функции start()

} // Конец тела ф-ии start()

//--------------------------------------------------------------------

int Func_yes_ret (int Times_in) // Описание пользоват. ф-ии

{ // Начало тела польз. ф-ии

datetime T_cur=TimeCurrent(); // Использование функции в..

// ..операторе присваивания

if(TimeHour(T_cur) > Times_in) // Использование функции в..

//..заголовке операт.if-else

return(1); // Возврат значения 1

return(5); // Возврат значения 5

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]