C++ 中的多重继承

Jinku Hu 2023年10月12日
  1. 使用多重继承将两个给定类的多个属性应用于另一个类
  2. 使用 virtual 关键字修复基类的多个副本
C++ 中的多重继承

本文将演示有关如何在 C++ 中使用多重继承的多种方法。

使用多重继承将两个给定类的多个属性应用于另一个类

C++ 中的类可以具有多个继承,这提供了从多个直接基类派生一个类的可能性。
这意味着如果没有仔细实现这些类,则可能会出现特殊的异常行为。例如,考虑以下代码段代码,其中 C 类是从 BA 类派生的。它们都有默认的构造函数,该构造函数输出特殊的字符串。虽然,当我们在 mainc 函数中声明 C 类型的对象时,三个构造函数会打印输出。请注意,构造函数以与继承相同的顺序被调用。另一方面,析构函数的调用顺序相反。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class A {
 public:
  A() { cout << "A's constructor called" << endl; }
};

class B {
 public:
  B() { cout << "B's constructor called" << endl; }
};

class C : public B, public A {
 public:
  C() { cout << "C's constructor called" << endl; }
};

int main() {
  C c;
  return 0;
}

输出:

Bs constructor called
As constructor called
Cs constructor called

使用 virtual 关键字修复基类的多个副本

请注意,以下程序输出 Planet 类构造函数的两个实例,分别是 MarsEarth 构造函数,最后是 Rock 类构造函数。同样,当对象超出范围时,Planet 类的析构函数将被调用两次。请注意,可以通过在 MarsEarth 类中添加 virtual 关键字来解决此问题。当一个类具有多个基类时,有可能派生
类将从其两个或多个基类继承具有相同名称的成员。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class Planet {
 public:
  Planet(int x) { cout << "Planet::Planet(int ) called" << endl; }
};

class Mars : public Planet {
 public:
  Mars(int x) : Planet(x) { cout << "Mars::Mars(int ) called" << endl; }
};

class Earth : public Planet {
 public:
  Earth(int x) : Planet(x) { cout << "Earth::Earth(int ) called" << endl; }
};

class Rock : public Mars, public Earth {
 public:
  Rock(int x) : Earth(x), Mars(x) { cout << "Rock::Rock(int ) called" << endl; }
};

int main() { Rock tmp(30); }

输出:

Planet::Planet(int ) called
Mars::Mars(int ) called
Planet::Planet(int ) called
Earth::Earth(int ) called
Rock::Rock(int ) called
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C++ Class