English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dans cet article, vous allez apprendre C ++Différents modèles d'héritage dans la programmation : héritage multiple avec exemples, héritage multiple et héritage hiérarchique.
HéritageC'est l'une des fonctionnalités centrales des langages de programmation orientés objet. Elle permet aux développeurs de logiciels de dériver une nouvelle classe à partir d'une classe existante. La classe dérivée hérite des fonctionnalités de la classe de base (classe existante).
C ++Il existe plusieurs modèles d'héritage dans la programmation.
在C ++Dans la programmation, non seulement une classe peut être dérivée d'une classe de base, mais une classe peut également être dérivée d'une classe dérivée. Cette forme d'héritage s'appelle l'héritage multiple.
class A { ... .. ... }; class B : public A { ... .. ... }; class C : public B { ... ... ... };
Ici, la classe B est dérivée de la classe de base A, et la classe C est dérivée de la classe dérivée B.
#include <iostream> using namespace std; class A { public: void display() { cout << "Contenu de la classe de base."; } }; class B : public A { }; class C : public B { }; int main() { C obj; obj.display(); return 0; }
输出结果
Contenu de la classe de base.
Dans ce programme, la classe C est dérivée de la classe B (qui est elle-même dérivée de la classe de base A).
L'objet obj de la classe C est défini dans la fonction main().
Lors de l'appel à la fonction display(), la fonction display() de la classe A sera exécutée. Cela est dû au fait qu'il n'existe pas de fonction display() dans les classes C et B.
Le compilateur recherche d'abord la fonction display() dans la classe C. Comme cette fonction n'existe pas dans cette classe, il la recherchera dans la classe B (puisque C est dérivée de B).
这个display()函数在B类中也不存在,所以编译器在A类中寻找它(因为B是从A派生出来的)。
如果C中存在display()函数,则编译器将覆盖类A的display()(因为成员函数覆盖)。
在C ++编程中,一个类可以从多个父类派生。 例如:Bat类是从Mammal和WingedAnimal基类派生的。 这很有意义,因为蝙蝠既是哺乳动物(Mammal)又是有翅膀的动物(WingedAnimal)。
#include <iostream> using namespace std; class Mammal { public: Mammal() { cout << "哺乳动物可以直接出生。" << endl; } }; class WingedAnimal { public: WingedAnimal() { cout << "有翼的动物能拍动翅膀。" << endl; } }; class Bat : public Mammal, public WingedAnimal { }; int main() { Bat b1; return 0; }
输出结果
哺乳动物可以直接出生。 有翼的动物能拍动翅膀。
多重继承最明显的问题发生在函数重写期间。
假设两个基类具有相同的函数,但在派生类中未重写该函数。
如果尝试使用派生类的对象调用该函数,则编译器将显示错误。这是因为编译器不知道要调用哪个函数。例如,
class base1 { public: void someFunction( ) { .... ... .... } }; class base2 { void someFunction( ) { .... ... .... } }; class derived : public base1, public base2 { }; int main() { derived obj; obj.someFunction() // 错误! }
这个问题可以通过使用范围解析函数来指定哪个函数属于base1或base2类来解决
int main() { obj.base1::someFunction( ); // 调用base1类的函数 obj.base2::someFunction(); // 调用base2类的函数 }
如果从基类继承多个类,则称为分层继承。在分层继承中,子类中共有的所有功能都包括在基类中。
例如:物理,化学,生物学均来自科学课。
class base_class { ... .. ... } class first_derived_class: public base_class { ... .. ... } class second_derived_class: public base_class { ... .. ... } class third_derived_class: public base_class { ... .. ... }