C++类继承时的构造函数

 更新时间:2022年3月9日 17:40  点击:280 作者:机器学习入坑者

前言:

子类需要编写自己的构造函数和析构函数,需要注意的是,子类只负责对新增的成员进行初始化和扫尾编写构造和析构函数,父类成员的初始化和扫尾工作由父类的构造函数和析构函数完成。

无论何种类型的继承方式,子类都无权访问父类的所有成员,所以子类对父类的初始化需要父类的构造函数完成。此时,子类的构造函数必须提供父类构造函数所需的参数。

子类构造函数的语法如下:

子类::子类(全部参数表):父类1(父类1参数表),父类2(父类2参数表)
      ...对象成员1(对象成员1参数表),对象成员2(对象成员2参数表)

其中,“全部参数表”中包含“所有父类所需参数”和“子类新增成员所需参数”;对象成员表示子类新增的对象成员(某些外部类的对象作为子类成员)。

必须指出,子类首先调用父类的构造函数,然后才调用自身的构造函数;如果子类含有多个构造函数,那么按照子类继承各个父类时的声明顺序,来调用各个父类的构造函数。

下面定义了X、Y和Z三个类,然后Point类继承这三个类:

class X {
public:
    X(int value) { printf("init X %d \n", value); }
};

class Y {
public:
    Y(int value) { printf("init Y %d \n", value); }
};

class Z {
public:
    Z() { printf("init Z \n"); }
};

class Point: public X, public Y , public z{
public:
    Point(int value_x, int value_y, int value_point):X(value_x),Y(value_y) {
        printf("init Point %d \n", value_point);
    }
};

可以看出,Point类的构造函数“全部参数表”中给出了“父类所需参数”和“本类成员所需参数”(此例中Point类没有对象成员),并以初始化列表的方式对各个父类进行初始化。下面定义Point类对象,

来查看子类和父类构造函数的调用顺序:

int main() {
    Point p(333, 666, 999);
}
// 得到下面的结果
init X 333
init Y 666
init Z
init Point 999

再次证明:因为Point声明时先继承X类后继承Y类,所以先调用X构造函数后调用Y构造函数,最后调用Z类构造函数。

此外,某个父类构造函数不需要参数时,子类构造函数可以不考虑此父类,系统会调用该父类默认的构造函数(比如上述的Z类)。如果某个父类即含有需要参数的构造函数,又含有不需参数的构造函数,程序员可自行决定使用哪一个。

通过总结可以得出,子类构造函数代码运行次序如下:

  • 首先,按照父类在继承声明时的次序调用对应构造函数;
  • 其次,按照子类的对象成员在子类中声明次序对其进行初始化;
  • 最后,执行子类构造函数体;

 到此这篇关于C++类继承时的构造函数的文章就介绍到这了,更多相关C++构造函数内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

原文出处:https://zhuanlan.zhihu.com/p/106920426

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • C++ STL标准库std::vector的使用详解

    vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • C++中取余运算的实现

    这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C++中四种加密算法之AES源代码

    本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
  • C++ 整数拆分方法详解

    整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25