HOWTO · C++

C++ 继承构造函数

关于 C++ 中的继承以及我们如何继承构造函数的完整编程教程。

本文是关于 C++ 中的继承概念以及我们如何在派生类中继承基类的构造函数。

C++ 中的继承

在 C++ 中,特别是在面向对象编程中,最基本和最广泛使用的概念是继承。我们可以将一个类定义为另一个类的子类。

这也允许我们重用一些代码功能并减少我们的实现时间。它允许我们将基类的功能和属性派生到派生类中。

  1. 基类——其属性和功能被另一个类使用的类称为基类。它有时也被称为超类。
  2. 派生类——接受另一个类的属性和功能的类称为派生类。它有时也称为子类。

考虑一些车辆的例子。Car、Bus 和 Truck 都是汽车,所有这些汽车都有一些共同的特点,也有一些不同的特点。

由于所有这些都是汽车,并且所有汽车都具有一些统一的功能。如果我们为所有这些汽车创建类,我们将做大量的代码重复。

如下图所示。

遗产

从上图中可以看出,所有汽车都具有相同的功能。这将创建三次重复的代码。

代码重复会产生许多其他问题,例如出错的机会、增加的处理时间等。继承用于克服这种情况。

我们可以创建一个包含所有这些功能的 Automobile 类,并使用该类派生其余类。这样,我们可以减少代码重复并提高代码的可重用性。

继承解决方案

从上图中可以看出,我们减少了重复代码,所有的功能都包含在了所有的类中。继承通常定义 is-a 关系。

例如,汽车 is-a 汽车、圆形 is-a 形状、狗 is-a 动物等。

C++ 中继承的实现

我们需要遵循以下语法从基类派生子类。

class derived - class - name : access - specifier base - class - name { .. }

这个访问说明符用于决定我们需要如何从基类继承功能。我们是需要全部还是需要其中一些是根据访问说明符决定的。

它可以是 publicprivateprotected。如果我们不指定访问说明符,则默认为 private

例子:

public
class Automobile {
 public:
  getFuelAmount();
  applyBrakes();
  startEngine();
  stopEngine();
} public class Car : public Automobile {
  pressHorn();
} public class Bus : public Automobile {
  pressHorn();
}

从上面的代码可以看出,两个派生类只有一个函数,两者并不统一,因为所有车辆的喇叭声音都不一样。因此,我们在派生类中制作了该函数,其余的在基类中。

考虑 Shapes 类的另一个示例。

#include <iostream>
#include <string>
using namespace std;
class Shapes {
 public:
  int w;
  int h;
};
class Square : public Shapes {
 public:
  int getArea() { return w * h; }
};
int main() {
  Square s;
  s.w = 5;
  s.h = 5;
  cout << "Area: " << s.getArea() << endl;
  return 0;
}

输出:

Area: 25

C++ 中的构造函数继承

我们可以从前面的示例中看到,函数和属性在派生类中继承自基类。但是如果我们需要调用基类的构造函数,那么我们需要在派生类的构造函数中显式调用它。

构造函数不会自动调用。考虑下面的一个例子。

#include <iostream>
using namespace std;
class baseClass {
 public:
  baseClass() { cout << "In constructor: Base" << endl; }
};
class derivedClass : public baseClass {
 public:
  derivedClass() : baseClass() { cout << "In Constructor: derived" << endl; }
};
int main() {
  derivedClass d;
  cout << "In main" << endl;
}

输出:

In constructor: Base
In Constructor: derived
In main

在 C++11 中,这可以使用 using-declaration 来完成。通过 using-declaration,我们可以在基类中使用派生类函数。

上面的例子可以修改如下。

#include <iostream>
using namespace std;
class baseClass {
 public:
  baseClass() { cout << "In constructor: Base" << endl; }
};
class derivedClass : public baseClass {
  using baseClass::baseClass;

 public:
  derivedClass() { cout << "In Constructor: derived" << endl; }
};
int main() {
  derivedClass d;
  cout << "In main" << endl;
}

它也将产生相同的输出。

In constructor: Base
In Constructor: derived
In main