похідні класи

Похідні класи. поліморфізм
Похідний клас можна розглядати як розширення існуючого класу. Вихідний клас називається базовим або батьківським, а похідний - подклассом або нащадком. Похідний клас являє собою розширення чи внесення змін до базового класу. Маючи батьківський клас, можна використовувати єдиний інтерфейс для отримання декількох похідних класів.
Будь-клас може бути батьківським, і будь-який похідний клас буде слідувати його опису. Клас-нащадок може мати додаткові можливості в порівнянні з базовим класом. У похідному класі можна змінити права доступу, додати нові елементи або перевантажити наявні методи.
Синтаксис похідного класу:

class ІмяПроізводногоКласса: (public / private / protected)

Слова public, private і protected є модифікаторами доступу методів похідного класу до елементів батьківського класу. Модифікатор public не змінює тип доступу, модифікатор private робить для всіх елементів базового класу тип доступу private, а модифікатор protected дозволяє доступ методів похідного класу до загальних елементів базового класу, але забороняє доступ для всіх інших методів. Якщо необхідно деякими елементами змінити тип доступу, то їх оголошують у похідному класі повторно у відповідній секції.
Якщо похідний клас має всього один батьківський клас, то таке спадкування називається простим, в іншому випадку спадкування називається складним. Приклад складного спадкування:

class C: public A, protected B;

Віртуальні функції
Метод може бути оголошений як virtual. В цьому випадку при його виклику через покажчик базового класу буде викликатися метод похідного класу.
приклад:

// віртуальний метод базового класу

// звичайний метод базового класу

class Derived: public Base

// віртуальний метод похідного класу

// звичайний метод похідного класу

// визначення покажчика на базовий клас

// Ініціалізація покажчика посиланням на похідний клас

bp-> virt (); // Виклик віртуального методу произв. класу.

bp-> nonVirt (); // Виклик невіртуального методу базового класу.

Якщо необхідно викликати віртуальний метод базового класу, то можна вказати ім'я класу з операцією дозволу видимості:

bp_> Base :: virt (); // Виклик віртуального методу базового класу.

friend void ClassB :: FuncName (); // дружній клас
friend void regularFunc (int); // дружня функція
>;

На дружні функції не впливають специфікатор доступу. Описи friend не взаємні, тобто дані класу не стають доступними класу, який оголосив його дружнім. Дружність не успадковується.