跳到主要内容

C++多重、多层及层次继承

提示
  1. 多级继承:在C++中,不仅可以从基类派生出一个类,还可以从已派生的类再派生出新的类,这被称为多级继承。例如,类C从类B派生,而类B又从类A派生。
  2. 多重继承:C++支持从多个基类派生一个新的类,即一个类可以有多个父类。例如,类蝙蝠可以从类哺乳动物和类有翼动物派生。这种继承可能导致命名冲突和函数重写的歧义。
  3. 层次继承:当多个类从同一个基类派生时,这种继承关系被称为层次继承。例如,物理、化学、生物学类都从科学类派生。在层次继承中,基类的特性可以被所有派生类共享。

继承 是面向对象编程语言的核心特性之一。它允许软件开发者从现有类派生出新类。派生类继承了基类的特性。

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<<"基类内容。";
}
};

class B : public A {};

class C : public B {};

int main() {
C obj;
obj.display();
return 0;
}

输出

基类内容。

在这个程序中,类 C 是从类 B 派生的(类 B 又是从基类 A 派生的)。

main() 函数中定义了类 C 的对象 obj。

当调用 display() 函数时,执行的是类 A 中的 display()。这是因为类 C 和类 B 中都没有 display() 函数。

编译器首先在类 C 中查找 display() 函数。由于该函数不存在,它在类 B 中查找(因为 C 是从 B 派生的)。

函数在类 B 中也不存在,所以编译器在类 A 中查找(因为 B 是从 A 派生的)。

如果 display() 函数存在于 C 中,编译器将覆盖类 A 的 display()(由于成员函数覆盖)。

C++ 多重继承

在 C++ 编程中,一个类可以从多个父类派生。例如,类 Bat 是从基类 Mammal 和 WingedAnimal 派生的。这是有意义的,因为蝙蝠既是哺乳动物也是有翼动物。

C++ 多重继承示例

示例 2:C++ 编程中的多重继承

#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 类的函数。
}

C++ 分层继承

如果多个类从一个基类继承,这被称为分层继承。在分层继承中,所有子类中共有的特性都包含在基类中。

例如,物理学、化学、生物学都是从科学类派生的。同样,狗、猫、马都是从动物类派生的。

分层继承的语法

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++ 程序演示分层继承

#include <iostream>
using namespace std;

// 基类
class Animal {
public:
void info() {
cout << "我是一个动物。" << endl;
}
};

// 派生类 1
class Dog : public Animal {
public:
void bark() {
cout << "我是一只狗。汪汪。" << endl;
}
};

// 派生类 2
class Cat : public Animal {
public:
void meow() {
cout << "我是一只猫。喵。" << endl;
}
};

int main() {
// 创建 Dog 类的对象
Dog dog1;
cout << "狗类:" << endl;
dog1.info(); // 父类的函数
dog1.bark();

// 创建 Cat 类的对象
Cat cat1;
cout << "\n猫类:" << endl;
cat1.info(); // 父类的函数
cat1.meow();

return 0;
}

输出

狗类:
我是一个动物。
我是一只狗。汪汪。

猫类:
我是一个动物。
我是一只猫。喵。

这里,DogCat 类都是从 Animal 类派生的。因此,这两个派生类都可以访问属于 Animal 类的 info() 函数。