Крок 3. Функція, яка отримує параметр базо- вого класу по посиланню
За допомогою перевизначення функції print() ми досягли того, щоб для об'єктів різних класів викликалися різні функції. Але чи завжди це буде вірно. Насправді, це лише ілюзія. Переконаймося в цьому, написавши зовнішню функцію, яка отримує параметр базового класу по посиланню і в своєму тілі просто запускає функцію print(). Викликавши цю функцію для об'єктів базового і похідного класів, за допогомою принципу підстановки ми один раз викличемо її для базового об'єкта, а інший раз - для похідного (який в узагальненні і є базовом, наприклад, спортсмен є людиною). Але чи спрацює функція print() по-різному? Насправді, ні. Тому що зв'язування відбулось на етапі трансляції, і виклик функції зв'язався з тілом базового методу. І працюватиме базовий метод для будь-яких вхідних параметрів.
#include <iostream.h>
#include <conio.h>
class Base //базовий клас
{
public:
void print();
};
void Base::print()
{
cout<<endl<<"Base-print"<<endl; // базовий метод
}
class Derive:public Base // похідний клас
{
public:
void print();
};
void Derive::print()
{
cout<<endl<<"Derive-print"<<endl; // перевизначений метод
}
void Fun(Base &M) // функція, що отримує об'єкт базового класу по посиланю
{
M.print(); // відбувається "раннє" (статичне) зв'язування з базовим методом
}
int main(int argc, char* argv[])
{
Base X; // об'єкт базового класу
Derive Y; // об'єкт похідного класу
X.print(); // виклик базового методу
Y.print(); // виклик похідного методу
cout<<endl;
Fun(X); // працює базовий метод
Fun(Y); // працює базовий метод !!!
getch();
return 0;
}