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
相关文章
在 C++ 中通过掷骰子生成随机值
发布时间:2023/04/09 浏览次数:169 分类:C++
-
本文解释了如何使用时间因子方法和模拟 C++ 中的掷骰子的任意数方法生成随机数。了解它是如何工作的以及它包含哪些缺点。提供了一个 C++ 程序来演示伪数生成器。
在 C++ 中使用模板的链表
发布时间:2023/04/09 浏览次数:158 分类:C++
-
本文解释了使用模板在 C++ 中创建链表所涉及的各个步骤。工作程序演示了一个链表,该链表使用模板来避免在创建新变量时声明数据类型的需要。
在 C++ 中添加定时延迟
发布时间:2023/04/09 浏览次数:142 分类:C++
-
本教程将为你提供有关在 C++ 程序中添加定时延迟的简要指南。这可以使用 C++ 库为我们提供的一些函数以多种方式完成。
在 C++ 中创建查找表
发布时间:2023/04/09 浏览次数:155 分类:C++
-
本文重点介绍如何创建查找表及其在不同场景中的用途。提供了三个代码示例以使理解更容易,并附有代码片段以详细了解代码。
如何在 C++ 中把字符串转换为小写
发布时间:2023/04/09 浏览次数:63 分类:C++
-
介绍了如何将 C++ std::string 转换为小写的方法。当我们在考虑 C++ 中的字符串转换方法时,首先要问自己的是我的输入字符串有什么样的编码
如何在 C++ 中确定一个字符串是否是数字
发布时间:2023/04/09 浏览次数:163 分类:C++
-
本文介绍了如何检查给定的 C++ 字符串是否是数字。在我们深入研究之前,需要注意的是,以下方法只与单字节字符串和十进制整数兼容。
如何在 c++ 中查找字符串中的子字符串
发布时间:2023/04/09 浏览次数:65 分类:C++
-
本文介绍了在 C++ 中检查一个字符串是否包含子字符串的多种方法。使用 find 方法在 C++ 中查找字符串中的子字符串
如何在 C++ 中把字符串转换为 Char 数组
发布时间:2023/04/09 浏览次数:107 分类:C++
-
本文介绍了在 C++ 中把字符串转换为 char 数组的多种方法。使用 std::basic_string::c_str 方法将字符串转换为 char 数组