在本文中,您将学习C ++编程中的不同继承模型:带有示例的多继承,多层和分层继承。
继承是面向对象编程语言的核心功能之一。它允许软件开发人员从现有的类派生一个新的类。派生类继承基类(现有类)的功能。C ++编程中有多种继承模型。
在C ++编程中,不仅可以从基类派生一个类,还可以从派生类派生一个类。这种继承形式称为多层继承。
- class A
- {
- ... .. ...
- };
- class B: public A
- {
- ... .. ...
- };
- class C: public B
- {
- ... ... ...
- };
这里,类B派生自基类A,类C派生自派生类B。
示例1:
- #include
- using namespace std;
-
- class A
- {
- public:
- void display()
- {
- cout<<"基类的内容。";
- }
- };
-
- class B : public A
- {
-
- };
-
- class C : public B
- {
-
- };
-
- int main()
- {
- C obj;
- obj.display();
- return 0;
- }
输出结果:
基类的内容。
分析:
在这个程序中,C类是从B类派生出来的(B类是从基类A派生出来的)。C类的obj对象在main()函数中定义。调用display()函数时,将执行类A中的display()。 这是因为在C类和B类中没有display()函数。编译器首先在类C中查找display()函数。由于该函数在该类中不存在,因此它将在类B中查找该函数(因为C是从B派生的)。这个display()函数在B类中也不存在,所以编译器在A类中寻找它(因为B是从A派生出来的)。如果C中存在display()函数,则编译器将覆盖类A的display()(因为成员函数覆盖)。
在C ++编程中,一个类可以从多个父类派生。 例如:Bat类是从Mammal和WingedAnimal基类派生的。 这很有意义,因为蝙蝠既是哺乳动物(Mammal)又是有翅膀的动物(WingedAnimal)。
示例2:
- #include
- 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 {
- ... .. ...
- }