
Полиморфизм и позднее связывание.
Если функция в базовом классе объявлена как виртуальтная, то её вызовы будут обрабатываться методом позднего связывания.
Каждый объект содержит ссылку на таблицу адресов виртуальных методов своего класса, при вызове виртуального метода его адрес извлекается соответсвующий данному объекту таблицы, таким образом вызывается то, тчо надо.
Виртуальные функции реализуют идею,один интерфейс – множество методов, что лежит в основе, понятие полиморфизм.
Class XL
Public
Virtual int A (int x) { X*X};
Doble B (double) {a=b/3};
}
Y y;
y. a
Class Y:puplic X {
Public
Int A (int X){
X=x*x}
….
}
Особенности работы с виртуальными функциями
Использование механизмов виртуальных функций нельзя изменять тип обращаемого значения и список аргументов функций.
Если 2 функции производных классов с одним и тем же именем имею разные аргументы и разные типы возвращаемых значений, причем в базовом классе функция объявлена как виртуальная, то механизм виртуальной функции игнорируется.
Class А {
Virtual void f1 ();
Virtual void f2 ();
Virtual void f3 ();
Void f ();
}
В базовом классе
Class B: public
Int f2 ();
Void f3 (int);
Void f();
}
Чистые виртуальные функции. Абстрактные классы
Версии виртуальные функции, которая с одной стороны должна быть определена, а с другой никогда не должна использоваться, должна быть объявлена как чистая виртуальная функция.
Формат объявления
Virtual тип имя (список параметров)=0;
Virtual void buied()=0:
В классах производных от базовых при наличии своих версий виртуальных функций они должны быть либо определены , либо объявлены как чистые виртуальные функции.
Класс с одной или большим количеством чистой виртуальной функции называется абстрактным классом.
Шаблоны функций
Шаблоны позволяют создать универсальный фрагмент кода, а затем использовать его многократно с различными типами данных или различными объектами.
Шаблоны функций позволяют использовать в качестве аргумента функций, тип переменной.
Вид объявления функции.
TempLate <class T>
Тип возвр результата имя функции (список параметров)
{
Тело функции
}
Указание компилятора, что T определяемое пользователем определение типа
T – имя типа
TempLate <class T>
T cub (TX) {
Return x*x*x;
}
Void main ()
Int a=3, float b=1,2
Cub (a);
Cub (b);
}
TempLate <class T>
T f (int a, T b) {
}
TempLate <class T1, Class T2>
T1 max (T1 x, T2 y) {
If (x<y)
Return y
Else
Return x
}