HOWTO · C++
C++ 继承构造函数
关于 C++ 中的继承以及我们如何继承构造函数的完整编程教程。
本文是关于 C++ 中的继承概念以及我们如何在派生类中继承基类的构造函数。
C++ 中的继承
在 C++ 中,特别是在面向对象编程中,最基本和最广泛使用的概念是继承。我们可以将一个类定义为另一个类的子类。
这也允许我们重用一些代码功能并减少我们的实现时间。它允许我们将基类的功能和属性派生到派生类中。
- 基类——其属性和功能被另一个类使用的类称为基类。它有时也被称为超类。
- 派生类——接受另一个类的属性和功能的类称为派生类。它有时也称为子类。
考虑一些车辆的例子。Car、Bus 和 Truck 都是汽车,所有这些汽车都有一些共同的特点,也有一些不同的特点。
由于所有这些都是汽车,并且所有汽车都具有一些统一的功能。如果我们为所有这些汽车创建类,我们将做大量的代码重复。
如下图所示。
从上图中可以看出,所有汽车都具有相同的功能。这将创建三次重复的代码。
代码重复会产生许多其他问题,例如出错的机会、增加的处理时间等。继承用于克服这种情况。
我们可以创建一个包含所有这些功能的 Automobile 类,并使用该类派生其余类。这样,我们可以减少代码重复并提高代码的可重用性。
从上图中可以看出,我们减少了重复代码,所有的功能都包含在了所有的类中。继承通常定义 is-a 关系。
例如,汽车 is-a 汽车、圆形 is-a 形状、狗 is-a 动物等。
C++ 中继承的实现
我们需要遵循以下语法从基类派生子类。
class derived - class - name : access - specifier base - class - name { .. }
这个访问说明符用于决定我们需要如何从基类继承功能。我们是需要全部还是需要其中一些是根据访问说明符决定的。
它可以是 public、private 或 protected。如果我们不指定访问说明符,则默认为 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