an>
void print () {<<"Це компонент базового класу ="
<
<
}
Виклики virtual print () використовують пізніше зв'язування.
Віртуальна функція не може бути оголошена як static (статична). При відсутності об'єкта Turbo C + + не може виконати пізніше зв'язування.
Оголошення віртуальної функції-методу автоматично робить віртуальними всі функції з цим ім'ям в підкласах.
Якщо метод в підкласі з тим же ім'ям приймає інші аргументи, то ніякого поліморфізму немає. Розглянемо приклад:
# include Base {void print () {<<"Це об'єкт базового класу"
<
}
}; SubClass: public Base {void print (char * c) {<<"Це об'єкт підкласу"
<
<
}
}; fn (Base & obj) {. print ();. print ("Relative object");// помилка компілятора # 1
} main () {aSubClass;. print ();// помилка компілятора # 2.print ("aSubClass"); (aSubClass);
}
Обидва класи, Base і SubClass, містять функції print (); однак, ці дві функції мають різні аргументи. Компілятор C + + не дозволить зробити виклик Base :: print () з невірними типами аргументів, що призведе до помилки, з відповідним повідомленням від компілятора. Аналогічна ситуація виникне і в другому випадку, коли компілятор зустріне виклик SubClass :: print (). br/>
5. Правило isA ()
Якщо способи обробки об'єкта підкласу відрізняються від способів обробки об'єктів базового класу, то кращим є спосіб перевантаження методу об'єкта базового класу з новим визначенням. Це може в деяких випадках виявитися незручним, особливо якщо функція була реалізована як некомпонентная. У таких випадках для функції необхідно знати тип об'єкта, з яким вона має справу.
Для вирішення цієї проблеми програміст повинен визначити метод ідентифікації, зазвичай званий isA (). Це віртуальне правило повертає константу, яка є унікальною для кожного типу підкласу. Можна перекласти слово isA як є (під) класом певного типу . Розглянемо наступну некомпонентную версію функції print ().
# include Base {ClassType {BASE, SUBCLASS}; ClassType isA () {return BASE;}
} print (Base & obj) {(obj.isA () == Base :: BASE) <<"Це об'єкт базового класу n"; (obj.isA () = = Base :: SUBCLASS) <<"Це об'єкт підкласу n"; <<"Це невід...