C++ 怎么调用父类构造函数 C++初始化列表调用基类构造写法【继承】
发布时间 - 2026-02-02 00:00:00 点击率:次父类构造函数必须在初始化列表中调用,不能在子类构造函数体内调用;多层继承时每层只调用直接父类,虚基类由最派生类显式调用;参数须为常量或构造函数参数,不可依赖未初始化成员;父类构造失败则整个对象构造中止。
父类构造函数必须在初始化列表里调用
子类对象构造时,父类部分必须先完成初始化,而 C++ 规定:基类构造函数**不能**在子类构造函数体内部调用(比如写成 Base::Base(42) 是非法的),只能通过成员初始化列表显式调用。
常见错误是试图在构造函数体内“手动调用”父类构造,结果编译失败,报错类似:error: constructor call in member initializer list is the only way to invoke a base class constructor。
- 正确写法:在子类构造函数声明后、函数体前的冒号
:后列出Base(args) - 如果父类有无参构造函数,且你不显式调用,编译器会自动插入默认调用;但一旦父类没有无参构造,就必须显式写
- 初始化列表中,基类调用必须出现在所有成员变量初始化之前(顺序由继承声明顺序决定,不是书写顺序)
多层继承时怎么指定调用哪一层的父类构造
每层子类只负责调用**直接父类**的构造函数,不跨层。编译器会自动链式展开:最派生类 → 直接基类 → 间接基类。
例如 Derived : public Middle,Middle : public Base,那么 Derived 的初始化列表只需写 Middle(x),而 Middle 自己的初始化列表里写 Base(y) —— Derived 不能也不该直接写 Base(z)。
- 若想让
Derived控制Base的参数,需通过Middle构造函数透传(比如加一个带int base_val的Middle构造重载) - 虚继承下的基类构造由**最派生类**直接负责调用,这点例外 —— 如果
Base是虚基类,Derived初始化列表中必须显式调用Base(...),否则即使Middle调用了也无效
初始化列表里调用父类构造时参数来源受限
初始化列表中所有表达式必须是常量表达式、参数名、或对 this 成员的简单访问(不能调用成员函数,也不能依赖尚未构造完成的成员)。
典型陷阱:想用子类成员变量的值去初始化

class Derived : public Base {
int x = 10;
public:
Derived() : Base(x) {} // ❌ 错误!x 此时尚未初始化
};
- 允许:直接使用构造函数参数,如
Derived(int v) : Base(v) {} - 允许:使用字面量、全局常量、
constexpr函数结果 - 不允许:调用非
constexpr成员函数、访问未初始化的成员、使用this->xxx(此时this已存在但对象未完成构造)
父类构造失败会导致整个对象构造中止
如果父类构造函数抛出异常,子类构造函数体不会执行,且子类的析构函数也不会被调用(因为对象没构造成功)。这是 RAII 安全的关键前提。
这意味着:别指望在子类构造函数体里“兜底处理”父类初始化失败;异常必须向上抛出或在调用点捕获。
- 若父类构造可能失败(如打开文件、分配资源),子类应做好异常传播准备
- 不要在初始化列表中做可能失败的复杂逻辑 —— 应该封装进父类构造,或改用工厂函数 +
std::optional/std::expected(C++23)等更明确的错误传递方式 - 注意:初始化列表中多个基类/成员的构造顺序是固定的(先基类后成员,同级按声明顺序),异常发生时已成功构造的部分会逆序析构
# ai
# c++
# 常量
# 封装
# 成员变量
# 成员函数
# 父类
# 子类
# 构造函数
# 析构函数
# Error
# int
# 继承
# class
# public
# 对象
# constructor
# this
# 列表中
# 体内
# 能在
# 链式
# 派生类
# 抛出
# 有无
# 自己的
# 装进
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用查询构建器?(Query Builder高级用法)
如何快速生成橙子建站落地页链接?
如何在宝塔面板中修改默认建站目录?
如何选择可靠的免备案建站服务器?
如何快速生成凡客建站的专业级图册?
如何实现建站之星域名转发设置?
如何在IIS中新建站点并解决端口绑定冲突?
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
Laravel如何优化应用性能?(缓存和优化命令)
如何用虚拟主机快速搭建网站?详细步骤解析
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
在线制作视频网站免费,都有哪些好的动漫网站?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
如何快速搭建高效香港服务器网站?
Laravel用户密码怎么加密_Laravel Hash门面使用教程
如何在Tomcat中配置并部署网站项目?
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
UC浏览器如何设置启动页 UC浏览器启动页设置方法
Python文本处理实践_日志清洗解析【指导】
php打包exe后无法访问网络共享_共享权限设置方法【教程】
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
如何彻底删除建站之星生成的Banner?
如何在云主机上快速搭建多站点网站?
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
Laravel如何自定义分页视图?(Pagination示例)
如何在IIS中配置站点IP、端口及主机头?
EditPlus 正则表达式 实战(3)
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
Android中AutoCompleteTextView自动提示
javascript如何操作浏览器历史记录_怎样实现无刷新导航
iOS验证手机号的正则表达式
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
php结合redis实现高并发下的抢购、秒杀功能的实例
Python文件操作最佳实践_稳定性说明【指导】
如何做网站制作流程,*游戏网站怎么搭建?
微信公众帐号开发教程之图文消息全攻略
Laravel如何与Inertia.js和Vue/React构建现代单页应用
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
如何用好域名打造高点击率的自主建站?
实例解析Array和String方法
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
非常酷的网站设计制作软件,酷培ai教育官方网站?

