Множественное, многоуровневое и иерархическое наследование C++
Множественное, многоуровневое и иерархическое наследование в C++
В этом руководстве мы узнаем о различных моделях наследования в программировании на C++:множественное, многоуровневое и иерархическое наследование с примерами.
Наследование — это одна из основных функций объектно-ориентированного языка программирования. Это позволяет разработчикам программного обеспечения создавать новый класс из существующего класса. Производный класс наследует функции базового класса (существующего класса).
В программировании на C++ существуют различные модели наследования.
<час>Многоуровневое наследование C++
В программировании на C++ вы можете не только получить класс от базового класса, но вы также можете получить класс от производного класса. Эта форма наследования известна как многоуровневое наследование.
class A { ... .. ... }; class B: public A { ... .. ... }; class C: public B { ... ... ... };
Здесь класс B является производным от базового класса A и класс C происходит от производного класса B .
<час>Пример 1. Многоуровневое наследование C++
#include <iostream>
using namespace std;
class A {
public:
void display() {
cout<<"Base class content.";
}
};
class B : public A {};
class C : public B {};
int main() {
C obj;
obj.display();
return 0;
}
Вывод
Base class content.
В этой программе класс C происходит от класса B (который является производным от базового класса A ).
объект объект класса C определяется в main()
функция.
Когда display()
вызывается функция, display()
в классе A выполняется. Это потому, что нет display()
функция в классе C и класс B .
Компилятор сначала ищет display()
функция в классе C . Поскольку функции там нет, она ищет функцию в классе B (как C происходит от B ).
Функция также не существует в классе B , поэтому компилятор ищет его в классе A (как B происходит от A ).
Если display()
функция существует в C , компилятор переопределяет display()
класса A (из-за переопределения функции-члена).
Множественное наследование C++
В программировании на C++ класс может быть производным от более чем одного родителя. Например, класс A Bat происходит от базовых классов Mammal и Крылатое животное . Это имеет смысл, потому что летучая мышь — это не только крылатое животное, но и млекопитающее.
<рисунок> <час>Пример 2. Множественное наследование в программировании на C++
#include <iostream>
using namespace std;
class Mammal {
public:
Mammal() {
cout << "Mammals can give direct birth." << endl;
}
};
class WingedAnimal {
public:
WingedAnimal() {
cout << "Winged animal can flap." << endl;
}
};
class Bat: public Mammal, public WingedAnimal {};
int main() {
Bat b1;
return 0;
}
Вывод
Mammals can give direct birth. Winged animal can flap.<час>
Неоднозначность множественного наследования
Наиболее очевидная проблема с множественным наследованием возникает во время переопределения функции.
Предположим, два базовых класса имеют одну и ту же функцию, которая не переопределяется в производном классе.
Если вы попытаетесь вызвать функцию, используя объект производного класса, компилятор выдаст ошибку. Это потому, что компилятор не знает, какую функцию вызывать. Например,
class base1 {
public:
void someFunction( ) {....}
};
class base2 {
void someFunction( ) {....}
};
class derived : public base1, public base2 {};
int main() {
derived obj;
obj.someFunction() // Error!
}
Эту проблему можно решить, используя функцию разрешения области видимости, чтобы указать, какую функцию классифицировать:base1 или base2.
int main() { obj.base1::someFunction( ); // Function of base1 class is called obj.base2::someFunction(); // Function of base2 class is called. }<час>
Иерархическое наследование C++
Если от базового класса наследуется более одного класса, это называется иерархическим наследованием. При иерархическом наследовании все функции, общие для дочерних классов, включаются в базовый класс.
Например, физика, химия, биология являются производными от класса естественных наук. Точно так же Dog, Cat, Horse являются производными от класса Animal.
<час>Синтаксис иерархического наследования
class base_class { ... .. ... } class first_derived_class: public base_class { ... .. ... } class second_derived_class: public base_class { ... .. ... } class third_derived_class: public base_class { ... .. ... }<час>
Пример 3. Иерархическое наследование в программировании на C++
// C++ program to demonstrate hierarchical inheritance
#include <iostream>
using namespace std;
// base class
class Animal {
public:
void info() {
cout << "I am an animal." << endl;
}
};
// derived class 1
class Dog : public Animal {
public:
void bark() {
cout << "I am a Dog. Woof woof." << endl;
}
};
// derived class 2
class Cat : public Animal {
public:
void meow() {
cout << "I am a Cat. Meow." << endl;
}
};
int main() {
// Create object of Dog class
Dog dog1;
cout << "Dog Class:" << endl;
dog1.info(); // Parent Class function
dog1.bark();
// Create object of Cat class
Cat cat1;
cout << "\nCat Class:" << endl;
cat1.info(); // Parent Class function
cat1.meow();
return 0;
}
Вывод
Dog Class: I am an animal. I am a Dog. Woof woof. Cat Class: I am an animal. I am a Cat. Meow.
Здесь как Dog
и Cat
классы являются производными от Animal
учебный класс. Таким образом, оба производных класса могут получить доступ к info()
функция, принадлежащая Animal
класс.
Язык C
- Класс и объект С#
- Абстрактный класс и метод С#
- Частичный класс C# и частичный метод
- Запечатанный класс и метод С#
- Классы и объекты С++
- Публичное, защищенное и частное наследование C++
- Дружественные функции C++ и дружественные классы
- Разница между структурой и классом:объяснение на примере C++
- Классы хранения в C++
- Дата и время С++