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
Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.
LinkedIn