English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste artigo, você aprenderá sobre C ++Diferentes modelos de herança na programação: herança múltipla com exemplos, herança multi-nível e herança hierárquica.
HerançaÉ uma das funcionalidades principais da programação orientada a objetos. Permite que os desenvolvedores de software derivem uma nova classe a partir de uma classe existente. A classe derivada herda as funcionalidades da classe base (classe existente).
Vector ( Vetor ) ++Existem vários modelos de herança na programação.
在C ++Na programação, além de derivar uma classe de uma classe base, também é possível derivar uma classe de uma classe derivada. Esse tipo de herança é chamado de herança multi-nível.
class A { class third_derived_class: public base_class { }; class B: public A { class third_derived_class: public base_class { }; class C: public B { ... ... ... };
Aqui, a classe B deriva da classe base A, e a classe C deriva da classe derivada B.
#include <iostream> using namespace std; class A { public: void display() { cout << "Conteúdo da classe base."; ... .. ... }; class B : public A { }; class C : public B { }; int main() { C obj; obj.display(); return 0; ... .. ...
输出结果
Conteúdo da classe base.
Neste programa, a classe C é derivada da classe B (a classe B é derivada da classe base A).
O objeto obj da classe C é definido na função main().
Quando a função display() é chamada, executa-se a função display() da classe A. Isso porque não há função display() nas classes C e B.
O compilador primeiro busca a função display() na classe C. Como essa função não existe na classe C, ele buscará a função na classe B (porque C herda 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 third_derived_class: public base_class { ... .. ... class first_derived_class: public base_class { class third_derived_class: public base_class { ... .. ... class first_derived_class: public base_class { class third_derived_class: public base_class { ... .. ... class second_derived_class: public base_class { class third_derived_class: public base_class { ... .. ...