уть мати різну поведінку, властивості, але все одно будуть об'єктами одного класу. У ООП існує три основних принципи побудови класів:
Інкапсуляція - це властивість, що дозволяє об'єднати в класі і дані, і методи, що працюють з ними і приховати деталі реалізації від користувача.
Спадкування - це властивість, що дозволяє створити новий клас-нащадок на основі вже існуючого, при цьому всі характеристики класу батька присвоюються класу-нащадку.
Поліморфізм - властивість класів, що дозволяє використовувати об'єкти класів з однаковим інтерфейсом без інформації про тип і внутрішній структурі об'єкта.
Приклад інкапсуляції в С ++: A
{: a, b;// дані відкритого інтерфейсу
int ReturnSomething ();// метод відкритого інтерфейсу: Aa, Ab;// приховані данниеDoSomething ();// прихований метод
};
Клас А інкапсулює властивості Aa, Ab і метод DoSomething, представляючи зовнішній інтерфейс ReturnSomething, a, b.
У спадкуванні клас-спадкоємець реалізує специфікацію вже існуючого класу (базовий клас). Це дозволяє звертатися з об'єктами класу-спадкоємця точно так само, як з об'єктами базового класу.
Існують два типи успадкування.
У простому спадкуванні клас, від якого відбулося спадкування, називається базовим або батьківським. Класи, які походять від базового, називаються нащадками, спадкоємцями або похідними класами.
У деяких мовах використовуються абстрактні класи. Абстрактний клас - це клас, що містить хоча б один абстрактний метод, він описаний в програмі, має поля, методи і не може використовуватися для безпосереднього створення об'єкта. Тобто від абстрактного класу можна тільки наслідувати. Об'єкти створюються тільки на основі похідних класів, успадкованих від абстрактного. Наприклад, абстрактним класом може бути базовий клас «співробітник вузу», від якого успадковуються класи «аспірант», «професор» і т. Д. Так як похідні класи мають спільні поля і функції (наприклад, поле «рік народження»), то ці члени класу можуть бути описані в базовому класі. У програмі створюються об'єкти на основі класів «аспірант», «професор», але немає сенсу створювати об'єкт на основі класу «співробітник вузу».
При множині спадкуванні у класу може бути більше одного предка. У цьому випадку клас успадковує методи всіх предків. Множинне успадкування реалізовано в C ++.
Множинне успадкування - потенційне джерело помилок, які можуть виникнути через наявність однакових імен методів в предках. У мовах, які позиціонуються як спадкоємці C ++ (Java, C # та ін.), Від множинного спадкоємства було вирішено відмовитися на користь інтерфейсів. Практично завжди можна обійтися без використання даного механізму. Однак, якщо така необхідність все-таки виникла, то, для вирішення конфліктів використання успадкованих методів з однаковими іменами, можливо, наприклад, застосувати операцію розширення видимості - «::» - для виклику конкретного методу конкретного батька.
Спроба вирішення проблеми наявності однакових імен методів в предках була зроблена в мові Ейфель, в якому при описі нового класу необхідно явно вказувати імпортовані члени кожного з успадкованих класів та їх іменування в дочірньому класі.
Більшість сучасних об'єктно-орієнтованих мов програмування (C #, Java, Delphi та ін.) підтримують можливість одночасно успадковуватися від класу-предка і реалізувати методи декількох інтерфейсів одним і тим же класом. Цей механізм дозволяє багато в чому замінити множинне спадкування - методи інтерфейсів необхідно перевизначати явно, що виключає помилки при спадкуванні функціональності однакових методів різних класів-предків.
Приклад успадкування в C ++: A {// базовий клас
};
class B: public A {// public спадкування
};
class C: protected A {// protected спадкування
};
class Z: private A {// private спадкування
};
У C ++ існує три типи успадкування: public, protected, private. Специфікатори доступу членів базового класу змінюються в нащадках наступним чином.
Якщо клас оголошений як базовий для іншого класу зі специфікатором доступу public, тоді public члени базового класу доступні як public члени похідного класу, protected члени базового класу доступні як protected члени похідного класу.
Якщо клас оголошений як базовий для іншого класу зі специфікатором доступу protected, тоді public і protected члени базового класу доступні як protected члени похідного класу.