Энциклопедия C++ Builder



ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ И C++ - часть 16


C++ однозначно определяет позднее связывание в момент выполнения и обеспечивает полиморфное поведение функций посредством их виртуализации. Листинг 3.10 обобщает синтаксис объявления виртуальных функций в базовом и производном классах.

jclass classNamel {

// Другие функции-члены

virtual returnType functionName(<список параметров>) ;

};

class className2 : public classNamel {

// Другие функции-члены

virtual returnType functionName(<cmicoK параметров>) ;

};

Листинг 3.10. Объявление виртуальных функции в иерархии классов.

Чтобы обеспечить полиморфное поведение функции F1 в объектах классов Parent и Child, необходимо объявить ее виртуальной. Листинг 3.11 содержит модифицированный текст программы.

class Parent {

public:

virtual double F1(double x) { return x*x; }

double F2(double x) { return Fl(x)/2; }

};

class Child : public Parent { public:

virtual double F1(double x) { return x*x*x; }

);

void main() {

Child child;

cout “ child.F2(3) “ endl;

}

Листинг 3.11. Позднее связывание виртуальных функций.

Теперь программа выдаст ожидаемый результат 13.5. Компилятор оттранслирует выражение child. F2 (3) в обращение к унаследованной функции Parent: : F2, которая в свою очередь вызовет переопределенную виртуальную функцию потомка Child: :F1.

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

Функция, объявленная виртуальной, считается таковой во всех производных классах - независимо от того, объявлена ли она в производных классах с ключевым словом virtual, или нет.




Содержание  Назад  Вперед