Глава 8: Обектно-ориентирано програмиране
Съдържание на осма
глава :
8.1. Презаредими функции с аргумент клас
8.2. Виртуални
функции
8.3 Виртуални базови класове
Обектно ориентираното
програмиране се характеризира с онаследяване и динамично свързване. С++ поддържа
онаследяването чрез извличане на класове - това беше темата на предишната глава.
Динамичното свързване се осъществява чрез виртуалните функции на
клас.
Йерархията на онаследяване дефинира отношения тип подтип между
типовете класове. Например, Panda е тип Bear, на свой ред Bear е тип ZooAnimal.
По същия начин и сортираният масив, и масив с проверка на ранга са типове
IntArray. Виртуалните функции дефинират типово зависими операции в йерархията на
онаследяването - например, функцията draw() на ZooAnimal или subscript оператора
на класа масив. Виртуалните функции осигуряват метод за капсулиране на детайли
по реализацията на йерархията на онаследяването от програмите, които ги
използват. В тази глава ще разгледаме подробно виртуалните функции. Ще
разгледаме също един специален случай на онаследяване на класове - този на
виртуалния (или още споделен) базов клас. В началото обаче ще преразгледаме
презаредимостта на име на функция с аргумент от тип клас.
8.1.
Презаредими функции с аргумент клас
Често една функция се прави
презаредима за да се осигури образец на съществуваща функция за работа с обекти
класове. Например, ако трябва да се дефинира клас комплексно число, проектантът
трябва след това да дефинира образец на библиотечната функция за извличане на
квадратен корен, която оперира с обекти от класа Complex:
extern
Complex& sqrt( Complex& );
Първоначалното разглеждане на
презаредими функции. Това е предмет на обсъждане на тази глава.
Сега ще
разгледаме точното съпоставяне на аргумент от тип клас, съпоставянето чрез
стандартни преобразования и съпоставянето чрез извикване на дефиниран от
потребителя оператор за преобразуване.
Точно съпоставяне
Обект от
клас се съпоставя точно само с формален аргумент от неговия тип клас.
Например,
ff( Bear& );
ff( Panda& );
Panda yingYang;//
exact match : ff( Panda& )
ff( yinYang );
По подобен начин
указател към обект от клас се съпоставя точно само с формален аргумент указател
към същия тип клас. Алгоритъмът за съпоставяне на аргументи не може да прави
разлика между обект и псевдоним от тип клас. Макар че следващите два образеца
декларират две различни функции, реалното обръщение е двузначно и предизвиква
грешка по време на компилация.
// warning : cannot be distinguished// by
the argument matching algorithm ff( Panda );
ff( Panda& );// ok : ff(
Panda& )
int (*pf)( Panda& ) = ff;
ff( yinYang ); // error :
ambiguous
pf( yinYang ); // ok