当前位置: 首页 > news >正文

C++ 中,派生类什么时候可以不定义构造函数,什么时候必须定义构造函数?

派生类是否需要定义构造函数,取决于基类的构造函数情况。

前提:派生类的构造函数负责初始化整个对象,包括基类部分和派生类新增的成员。

情况1、如果基类:

(1)不定义构造函数,or

(2)有无参构造函数,or

(3)定义了带默认形参值的构造函数,

这3种情况本质上就是初始化基类数据时可以不需提供参数,这样,派生类即使不定义构造函数,继承到的基类数据也可以被初始化,所以在这些情况下,派生类可以不定义构造函数。

情况2、如果基类定义了带参数的构造函数且没有默认形参值,

则在初始化基类数据的时候,就必须提供具体的参数值,所以派生类在初始化这些基类的数据的时候,也需要提供具体参数值,这些参数值必须在构造函数里给出,所以派生类必须定义构造函数。

总之,派生类是否需要定义构造函数,取决于初始化基类对象时是否必须提供参数。

如果可以不提供参数(上述情况1),派生类就可以不定义构造函数;

如果必须提供参数(上述情况2),派生类就必须定义构造函数。

 情况1:

(1)不定义构造函数实例:

#include <iostream>
using namespace std;class Date {
public:void setDate(int y, int m, int d) {year = y;month = m;day = d;}void showDate() {cout << year << "-" << month << "-" << day << endl;}private:int year, month, day;
};int main() {Date a_date; // 创建Date类的对象,会调用默认构造函数a_date.setDate(2024, 3, 25); // 设置日期a_date.showDate(); // 输出日期Date b_date; // 再次创建Date类的对象b_date.showDate(); // 输出默认初始化的日期return 0;
}

(2)定义无参构造函数实例:

#include <iostream>
using namespace std;class Date {
public:Date() { // 无参构造函数year = 1;month = 1;day = 1;}void showDate() {cout << year << "-" << month << "-" << day << endl;}
private:int year, month, day;
};int main() {Date b_date; // 使用无参构造函数创建对象b_date.showDate(); // 输出日期return 0;
}

(3)定义带默认形参值的构造函数实例:

#include <iostream>
using namespace std;class Date {
public:Date(int y = 1, int m = 1, int d = 1) { // 带默认形参值的构造函数year = y;month = m;day = d;}void showDate() {cout << year << "-" << month << "-" << day << endl;}private:int year, month, day;
};int main() {Date today; // 使用默认参数初始化,即今天的日期是 1-1-1today.showDate(); // 输出日期Date birthday(1999, 5, 23); // 使用具体参数初始化,即生日是 1999-5-23birthday.showDate(); // 输出日期return 0;
}

以Date为基类产生派生类时,这3种情况本质上就是初始化基类Date的数据时可以不需提供参数,这样,派生类即使不定义构造函数,继承到的基类数据也可以被初始化,所以在这些情况下,派生类可以不定义构造函数。

情况2:

定义带参数的构造函数且没有默认形参值

#include <iostream>
using namespace std;class Date {
public:Date(int y, int m, int d) { // 构造函数year = y;month = m;day = d;}void showDate() {cout << year << "-" << month << "-" << day << endl;}
private:int year, month, day;
};int main() {Date a_date(2024, 3, 25); // 必须使用带参数的构造函数创建对象a_date.showDate(); // 输出日期return 0;
}

以Date为基类产生派生类时,派生类在初始化基类Date的数据时,需要提供具体参数值,这些参数值必须在构造函数里给出,所以派生类必须定义构造函数。

相关文章:

  • Flink 核心概念解析:流数据、并行处理与状态
  • TDengine 运维—容量规划
  • leetcode 25. Reverse Nodes in k-Group
  • 鸿蒙HarmonyOS最新的组件间通信的装饰器与状态组件详解
  • SpringMVC 通过ajax 实现文件的上传
  • 关于光谱相机的灵敏度
  • naive-ui切换主题
  • 实验分享|基于千眼狼sCMOS科学相机的流式细胞仪细胞核成像实验
  • 【marked与katex结合】渲染公式
  • Vue3 Element Plus el-table-column Sortable 排序失效
  • 2025最新obs31.0.x版本编译办法,windows系统
  • 数据湖和数据仓库的区别
  • ES的倒排索引和正排索引的区别及适用场景?为什么倒排索引适合全文搜索?
  • vue3 threejs 物体发光描边
  • 电力设备制造企业数字化转型路径研究:从生产优化到生态重构
  • WordPress_Madara 本地文件包含漏洞复现(CVE-2025-4524)
  • k8s-ServiceAccount 配置
  • GPT 等decoder系列常见的下游任务
  • Vite + Vue 工程中,为什么需要关注 `postcss.config.ts`?
  • CSS、SCSS 和 SASS 的语法差异
  • 做招聘网站的需求分析/关键词代发包收录
  • 个人网站也要备案吗/百度推广登陆首页
  • 做外汇都看那些网站/如何免费找精准客户
  • 网站后台日志/广安seo外包
  • 信誉好的龙岗网站建设/seo服务深圳
  • 网站要怎么做才能让360收录/网络营销企业案例分析