在C++中子类继承和调用父类的构造函数方法

2023-10-29

构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。

如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。

构造原则如下:

    1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。

    2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。

    3. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数。

    4. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。

    5. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。

    6. 如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式,比如:

     

  1. #include <iostream.h>  
  2.  class animal  
  3.  {  
  4.  public:  
  5.    animal(int height, int weight)  
  6.    {  
  7.      cout<<"animal construct"<<endl;  
  8.    }  
  9.    …  
  10.  };  
  11.  class fish:public animal  
  12.  {  
  13.  public:  
  14.    fish():animal(400,300)  
  15.    {  
  16.      cout<<"fish construct"<<endl;  
  17.    }  
  18.    …  
  19.  };  
  20.  void main()  
  21.  {  
  22.    fish fh;  
  23.  }  

  在fish类的构造函数后,加一个冒号(:),然后加上父类的带参数的构造函数。这样,在子类的构造函数被调用时,系统就会去调用父类的带参数的构造函数去构造对象。



例外像MFC常见的CDialog继承可以看到这种例子..


头文件中


  1. #pragma once  
  2. class CDrugDlg : public CDialogEx  
  3. {  
  4.     DECLARE_DYNAMIC(CDrugDlg)  
  5.   
  6.   
  7. public:  
  8.     CDrugDlg(CWnd* pParent = NULL);   // 标准构造函数  
  9.     virtual ~CDrugDlg();  
  10.   
  11.   
  12. // 对话框数据  
  13.     enum { IDD = IDD_DRUG_DIALOG };  
  14.   
  15. protected:  
  16.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持  
  17.   
  18.   
  19.     DECLARE_MESSAGE_MAP()  
  20. public:  
  21.     afx_msg void OnSize(UINT nType, int cx, int cy);  
  22.     virtual BOOL OnInitDialog();  
  23.     afx_msg void OnPaint();  
  24.     afx_msg void OnDestroy();  
  25. };  



实现文件

  1. // DrugDlg.cpp : 实现文件  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "Medical.h"  
  6. #include "DrugDlg.h"  
  7. #include "afxdialogex.h"  
  8.   
  9. // CDrugDlg 对话框  
  10.   
  11. IMPLEMENT_DYNAMIC(CDrugDlg, CDialog)  
  12.   
  13. CDrugDlg::CDrugDlg(CWnd* pParent /*=NULL*/)  
  14.     :CDialogEx(CDrugDlg::IDD, pParent)  
  15. {  
  16.   
  17. }  
  18.   
  19. CDrugDlg::~CDrugDlg()  
  20. {  
  21. }  




这种初始化方式,还常用来对类中的常量(const)成员进行初始化,如下面的代码所示:

  1. class point  
  2.   {  
  3.   public:  
  4.      point():x(0),y(0)  
  5.   private:  
  6.      const int x;  
  7.      const int y;  
  8.   };  


  当然,类中普通的成员变量也可以采取此种方式进行初始化,然而,这就没有必要了..

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在C++中子类继承和调用父类的构造函数方法 的相关文章

随机推荐

  • 解决安装visual studio installer 报错,无法下载安装文件的问题

    文章目录 解决安装visual studio installer 报错 无法下载安装文件的问题 Visual Studio 2019下载官网 一 VS2019安装问题 问题 解决方法1 解决方法2 解决方法3 解决方法4 解决方法5 解决方
  • 设计模式(四)单例和简单工厂的融合

    前面三篇文章介绍了三种模式 单例 简单工厂和工厂方法 其中 简单工厂和工厂方法都是基于同一个实际问题 但是 这个例子里有几个问题 1 职工的创建在main函数中 不合理 可能多个函数都会需要访问职工信息 2 职工是程序直接创建的 不合理 一
  • Unity 第一期

    1 让一个物体围绕某一点旋转 有几种方法 分别是什么 旋转函数transform Rotate 来实现 transform的RotateAround vector3 postion vector3 axis float angle 函数 J
  • vad算法 c语言,腾讯视频cKey算法

    接口地址 https vd l qq com proxyhttp 接口参数示例 buid vinfoad adparam pf in ad type LD KB PVL pf ex pc url https v qq com x cover
  • python语言基本控制结构程序异常_Python学习笔记整理(十七)异常处理

    一 异常基础 try except 捕捉由代码中的异常并恢复 匹配except里面的错误 并自行except中定义的代码 后继续执行程序 发生异常后 由except捕捉到异常后 不会中断程序 继续执行try语句后面的程序 try final
  • spark高级数据分析系列之第三章音乐推荐和 Audioscrobbler 数据集

    3 1数据集和整体思路 数据集 本章实现的是歌曲推荐 使用的是ALS算法 ALS是spark mllib中唯一的推荐算法 因为只有ALS算法可以进行并行运算 使用数据集在这里 里面包含该三个文件 表一 user artist data tx
  • Basic Level 1017 A除以B (20分)

    题目 本题要求计算 A B A B A B 其中 A A A是不超过1000位的正整数
  • RabbitMQ高级特性-Confirm确认消息

    Confirm确认消息 消息的确认 是指生产者投递消息后 如果Broker收到消息 则会给我们产生一个应答 生产者进行接收应答 用来确定这条消息是否正常发送到Broker 这种方式也是消息的可靠性投递的核心保障 如何实现Confirm确认消
  • 实战二十二:pytorch transformer 时间序列预测 多变量输入 单变量输出 完整代码数据 可直接运行

    代码演示视频 完整代码 pip install openpyxl i https pypi tuna tsinghua edu cn simple pip install optuna i https pypi tuna tsinghua
  • 电脑端teams一直在线小程序,简单好用易上手

    居家办公的你 会不会想要摸鱼 会不会想要下楼拿快递 会不会想要出去下馆子 然而 teams的5分钟不操作电脑状态就变为离开大大的阻挡了你幸福生活的脚步 不用担心 我来帮助你 只要用了这个脚本 24小时在线都没问题 老板看了直呼靠谱 心动不如
  • Java SpringBoot Spring Cloud 文件上传下载(图片文档上传下载) 以及上传下载文件大小限制.java

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 使用步骤 1 addpicture MultipartFile file 方法 2 download String fileName HttpServle
  • 软考-架构篇-软件架构风格

    概述 软件架构风格分类 数据流风格 批处理序列 管道 过滤器 对比 调用 返回风格 主程序 子程序 面向对象风格 层次结构风格 独立构件风格 虚拟机风格 仓库风格 概述 软件架构设计的一个核心问题是 能否使用重复的软件架构模式 即能否达到架
  • ubuntu16.04升级cmake

    好文章值得分享 https zhuanlan zhihu com p 93480024
  • Vue Cli 4x 新建初始化项目

    vue cli 最新版本已经出到 4 5 8 了 以往的一些配置 命令可能都不一样了 最新的vue 项目创建不是以往的 vue init webpack 这样很可能会一直卡死 所以多看官方文档是很重要的 那么我们废话不多说 开始教大家新建项
  • 业务系统故障率居高不下:有哪些非常有效的治理大招?

    一分钟精华速览 聊稳定性治理的文章很多 但面对系统的 各类疾病 到底该从哪里着手才能立竿见影 怎么才能 药到病除 相信在看这个问题时 大家会抱着 能不能学两招回去用 的心态阅读 TakinTalks论道系列 第3期 我们采访了4位资深从业人
  • A Magic Lamp 【HDU - 3183】【线段树区间最小值】

    题目链接 简单而言 这道题就是RMQ问题 但是我个人更喜欢用线段树来写区间最大值 因为这样子会好更新些 奈何这道题不需要更新 我们要从长度为N的字符串中删除M个元素 那么岂不是只剩下 N M 个字符串的长度 所以 我们不妨来找 N M 的长
  • C++预处理详解

    本文在参考ISO IEC 14882 2003和cppreference com的C Preprocessor的基础上 对C 预处理做一个全面的总结讲解 如果没有特殊说明 所列内容均依据C 98标准 而非特定平台相关 如VC 的 C 11新
  • 求两条轨迹间的hausdorff距离_轨迹数据压缩的DouglasPeucker算法

    点击蓝字关注我们 交通数据中会有很多的轨迹数据 轨迹数据一般是按秒采集 所以轨迹数据的量都是很大的 但是在进行数据分析时 轨迹数据量太大会影响运算效率 而且很多轨迹点是没有必要分析的 所以需要对数据进行压缩 轨迹数据压缩技术的主要目标是在不
  • open-api 算法实现

    要求 推荐在openEuler中实现 参考https www cnblogs com rocedu p 6012545 html第三节 提交相关代码码云 或github 链接 我使用博客园 提交不少于6张编译测试过程截图 至少包含SM4 S
  • 在C++中子类继承和调用父类的构造函数方法

    构造方法用来初始化类的对象 与父类的其它成员不同 它不能被子类继承 子类可以继承父类所有的成员变量和成员方法 但不继承父类的构造方法 因此 在创建子类对象时 为了初始化从父类继承来的数据成员 系统需要调用其父类的构造方法 如果没有显式的构造