Наследяване в C++
Наследството е фундаментално понятие в ООП (обектно ориентирано програмиране) . Това е механизмът, чрез който на един клас е позволено да наследи характеристиките (полета и методи) на друг клас. Наследяването означава създаване на нови класове на базата на съществуващи. Клас, който наследява от друг клас, може да използва повторно методите и полетата на този клас.
Пример: В следващия пример Animal е основният клас, а Dog Cat и Cow са производни класове, които разширяват класа Animal.
Inheritance C++ #include using namespace std ; class Animal { public : void sound () { cout < < 'Animal makes a sound' < < endl ; } }; class Dog : public Animal { public : void sound () { cout < < 'Dog barks' < < endl ; } }; class Cat : public Animal { public : void sound () { cout < < 'Cat meows' < < endl ; } }; class Cow : public Animal { public : void sound () { cout < < 'Cow moos' < < endl ; } }; int main () { Dog d ; d . sound (); Cat c ; c . sound (); Cow cow ; cow . sound (); return 0 ; }
Изход
Dog barks Cat meows Cow moos
Обяснение:
- Animal е основният клас с функция sound().
- Dog Cat и Cow са производни класове, всеки от които дефинира свой собствен метод sound().
- В main() обектите на Dog Cat и Cow се създават отделно.
- Когато извикаме sound() на всеки обект, се изпълнява методът на съответния дъщерен клас (куче лае котка мяука крава мука).
Синтаксис
C++ class ChildClass : public ParentClass { // Additional fields and methods };
Как работи наследяването в C++?
Двоеточие (:) с an спецификатор на достъп се използва за наследяване в C++. Той позволява на производния клас (дъщен клас) да наследи членовете на данните (полетата) и членските функции (методите) на базовия клас (родителски клас).
Когато един клас наследи друг клас, той получава всички достъпни членове на родителския клас и дъщерният клас също може да предефинира (замени) или да добави нова функционалност към тях.
Видове наследяване в C++
По-долу са различните типове наследяване, които се поддържат от C++.
1. Единично наследяване
При единично наследяване подклас се извлича само от един супер клас. Той наследява свойствата и поведението на клас с един родител. Понякога е известно също като просто наследяване.
Single Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehicle is Car' < < endl ; } }; int main () { Car obj ; return 0 ; }
Изход
This is a Vehicle This Vehicle is Car
2. Множествено наследяване
в Множествено наследяване един клас може да има повече от един суперклас и да наследява функции от всички родителски класове.
Multiple Inheritance C++ #include using namespace std ; class LandVehicle { public : void landInfo () { cout < < 'This is a LandVehicle' < < endl ; } }; class WaterVehicle { public : void waterInfo () { cout < < 'This is a WaterVehicle' < < endl ; } }; // Derived class inheriting from both base classes class AmphibiousVehicle : public LandVehicle public WaterVehicle { public : AmphibiousVehicle () { cout < < 'This is an AmphibiousVehicle' < < endl ; } }; int main () { AmphibiousVehicle obj ; obj . waterInfo (); obj . landInfo (); return 0 ; }
Изход
This is an AmphibiousVehicle This is a WaterVehicle This is a LandVehicle
3. Многостепенно наследяване
Многостепенното наследяване в C++ означава, че даден клас е извлечен от друг производен клас, образувайки верига от наследяване.
Multilevel Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; // Derived class from Vehicle class FourWheeler : public Vehicle { public : FourWheeler () { cout < < '4 Wheeler Vehicles' < < endl ; } }; // Derived class from FourWheeler class Car : public FourWheeler { public : Car () { cout < < 'This 4 Wheeler Vehicle is a Car' < < endl ; } }; int main () { Car obj ; return 0 ; }
Изход
This is a Vehicle 4 Wheeler Vehicles This 4 Wheeler Vehicle is a Car
4. Йерархично наследство
При йерархичното наследяване повече от един подклас се наследява от един базов клас. т.е. повече от един производен клас се създава от един базов клас. Например колите и автобусите са превозни средства.
Hierarchical Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehicle is Car' < < endl ; } }; class Bus : public Vehicle { public : Bus () { cout < < 'This Vehicle is Bus' < < endl ; } }; int main () { Car obj1 ; Bus obj2 ; return 0 ; }
Изход
This is a Vehicle This Vehicle is Car This is a Vehicle This Vehicle is Bus
5. Хибридно наследяване
Когато два или повече вида наследство се комбинират в една програма. Например един клас може да използва множествено наследяване и също да бъде част от многостепенна верига за наследяване.
Hybrid Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Fare { public : Fare () { cout < < 'Fare of Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehical is a Car' < < endl ; } }; class Bus : public Vehicle public Fare { public : Bus () { cout < < 'This Vehicle is a Bus with Fare' ; } }; int main () { Bus obj2 ; return 0 ; }
Изход
This is a Vehicle Fare of Vehicle This Vehicle is a Bus with Fare
Хибридното наследяване може да доведе до проблем с диаманти в C++. Това се случва, когато един клас наследява от два класа, които споделят един и същ базов клас. В резултат на това производният клас получава множество копия на членовете на базовия клас, което създава неяснота кой от тях да се използва.
Забележка: Решението е да се използва виртуално наследяване, така че да се споделя само едно копие на базовия клас.
Предимства на наследяването в C++
- Повторна употреба на кода : Произведеният клас може директно да използва повторно членовете на данните и методите на своя базов клас, като избягва дублирането на код.
- Абстракция: Поддържа абстрактни класове (класове с чисти виртуални функции), които дефинират общ интерфейс, налагащ абстракция.
- Йерархия на класа: Можете да изградите йерархии (базова → извлечена → допълнително извлечена), за да моделирате връзки в реалния свят.
- Полиморфизъм: Напълно поддържа полиморфизъм по време на изпълнение чрез виртуални функции, както и полиморфизъм по време на компилиране чрез претоварване на функции и шаблони.
Недостатъци на наследяването в C++
- Плътно свързване: Дъщерният клас става зависим от родителския клас. Всяка промяна в базовия клас може да наложи промени в производните класове.
- Намалена гъвкавост: Понякога наследяването се използва неправилно, когато композицията (има връзка) би била по-добра, водеща до по-малко гъвкав код.
- Повишена сложност: Дълбоките йерархии на наследяване (многостепенни или хибридни) могат да направят кода труден за разбиране, поддръжка и отстраняване на грешки.
- Проблем с диаманта: При хибридно или множествено наследяване може да възникне неяснота, ако един и същ базов клас се наследи многократно.
- Разход на виртуални функции: Ако се използва полиморфизъм (виртуални функции), има малко време за изпълнение поради търсене на виртуална таблица.