- •Просте та множинне наслідування.
- •Робота конструктора й деструктора
- •Void main ( )
- •Базовий клас координат
- •Похідний клас точки
- •Використання конструктора з параметрами
- •Перевизначення й виклик членів базового класу
- •Множинне наслідування.
- •Робота конструктора й деструктора
- •Void main ( )
- •Віртуальні базові класи
- •Int Getx ( ) { return X ; }
- •Void main ( )
- •Int Getx ( ) { return X ; }
- •Void main ( )
Базовий клас координат
class Coord
{
protected:
double x, y ; // координати
public :
Coord ( ) { x = 0 ; y = 0 ; }
Coord ( double X, double Y ) { x = X ; y = Y ; }
void Print ( ) ;
void Input ( ) ;
} ;
void Coord :: Print ( )
{
cout<<"\tx="<<x<<"\ty="<<y<<’\n'
}
void Coord :: Input (
{
cout <<"\tx="; cin>>x ;
cout <<"\ty="; cin>>y ;
}
Похідний клас точки
Якщо в похідного класу є всього один базовий клас, то говорять про просте наслідування.
Наступний приклад ілюструє просте наслідування.
#include ”Coord.h”
class Dot : public Coord
{
char name ;
public :
Dot ( char Name ) : Coord ( ){ name = Name ; }
Dot ( char Name, double X, double Y ) : Coord ( X, Y ){ name = Name ; }
void Input ( ) ;
void Print ( ) ;
} ;
void Dot :: Print ( )
{
cout<<”coordinaty point”<<name<<” :”;
Coord :: Print ( ) ;
}
void Dot :: Input ( )
{
cout<<”vvod coordinat point”<<name<<”:”;
Coord :: Input ( ) ;
}
void main()
{
Dot C ('C', 3, 4 ), D ('D') ;
C.Print ( ) ; D.Print ( ) ;
cout<<"CD="<<C.Dist (D)<<'\n';}
Використання конструктора з параметрами
Оскільки похідний клас повинен успадкувати всі члени батьківського, при побудові об'єкта свого класу він повинен забезпечити ініціалізацію успадкованих даних-членів.
Дані-члени похідного класу можуть використовувати значення даних-членів батьківського класу. Тому ініціалізацію успадкованих даних-членів класу повинна бути виконана до ініціалізації даних-членів похідного класу. Конструктор похідного класу будується з використанням наступного синтаксису:
<констр_похідного_класу> ( <список_параметрів> ) :
<констр_базового_класу> ( <список_аргументів> )
{ <тіло_конструктора> }
Тут використовується список ініціалізації елементів, у якім вказується конструктор базового класу. Частина параметрів, переданих конструкторові похідного класу, звичайно використовується в якості аргументів конструктора базового класу. Потім у тілі конструктора похідного класу виконується ініціалізація даних-членів, що належать цьому класу.
Перший конструктор класу Dot має вигляд:
Dot ( char Name ) : Coord ( ) { name = Name ; }
При виклику цього конструктора спочатку викликається конструктор базового класу Coord ( ), який ініціалізує успадковані дані-члени x і y нулями. Потім у тілі конструктора дане-член name ініціалізується значенням параметра конструктора Name.
Другий конструктор класу Dot має вигляд:
Dot ( char Name, double X, double Y ) : Coord ( X, Y ) { name = Name ; }
При виклику другого конструктора спочатку викликається конструктор базового класу Coord ( double X,double Y ), який ініціалізує успадковані дані-члени x і y значеннями параметрів конструктора X і Y. Потім у тілі конструктора дане-член name ініціалізується значенням параметра конструктора Name.
Перевизначення й виклик членів базового класу
У похідному класі звичайно додаються нові члени до членів базового класу. Однак існує також можливість перевизначення (або заміщення) членів базового класу. Звичайно використовується перевизначення функцій-членів базового класу. Щоб перевизначити функцію-член базового класу в похідному класі, досить включити її прототип в оголошення цього класу й потім дати її визначення. Прототипи перевизначеної функції в базовому й похідному класах повинні збігатися.
Іноді виникає необхідність викликати функцію-член базового класу, а не її перевизначений варіант, це можна зробити за допомогою операції дозволу області видимості, застосовуваної у формі:
<ім'я_класу> :: <ім'я_члена>
Це дає можливість компіляторові "бачити" за межами поточної області видимості. Особливо часто це доводиться робити при перевизначенні функцій-членів. Перевизначена функція-член може викликати відповідну функцію-член базового класу, а потім виконувати деяку додаткову роботу (або навпаки).
У наведеному вище класі Dot була перевизначена функція Print ( ). Тіло функції містить оператори, які виводять на екран заголовок “Координати крапки ” і ім'я крапки. Далі викликається функція Print ( ), яка є членом батьківського класу Coord, за допомогою оператора:
Coord :: Print ( ) ;
Член батьківського класу Coord функція Print ( ) виводить на екран у тому ж рядку координати точки. У результаті на екрані з'явиться, наприклад текст:
Координати точки A : x = 4 y = 5
