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

C++继承与构造函数调用详解

当然可以!下面我将分别解释这两段 C++ 代码,并为它们加上详细的中文注释,帮助你理解类的继承、构造函数调用顺序以及面向对象的基本概念。


✅ 第一段代码:基类和派生类的构造函数调用顺序

#include <iostream>
using namespace std;// 基类 Base
class Base {
public:int data;// 基类构造函数,接收一个整型参数 xBase(int x) {std::cout << "Base constructor with x = " << x << std::endl;}
};// 派生类 Derived,公有继承自 Base
class Derived : public Base {
public:double ydata;// 派生类构造函数,接收两个参数 x 和 y// 使用初始化列表调用基类 Base 的构造函数Derived(int x, double y) : Base(x) {std::cout << "Derived constructor with y = " << y << std::endl;}
};int main() {// 创建派生类对象 obj,传入参数 10 和 3.14Derived obj(10, 3.14);return 0;
}

🔍 运行结果(输出):

 

浅色版本

Base constructor with x = 10
Derived constructor with y = 3.14

🧠 解释:

  • Base 是基类,它有一个带参数的构造函数。
  • Derived 是从 Base 公有继承来的派生类
  • 在创建 Derived 类的对象时,会先调用基类 Base 的构造函数,然后再执行派生类自己的构造函数。
  • 构造函数中使用了成员初始化列表 : Base(x) 来显式调用基类构造函数。
  • 这样可以确保基类部分在派生类之前被正确初始化。

✅ 第二段代码:Vehicle 基类与 Roadster 派生类的继承关系

 

cpp

浅色版本

#include <iostream>
using namespace std;// 基类 Vehicle(交通工具)
class Vehicle { // 抽象的交通工具类
public:string contry;   // 制造国家double price;    // 价格// 基类构造函数,用于初始化 contry 和 priceVehicle(string contry, double price) {cout << "基类的构造函数被调用" << endl;this->contry = contry;this->price = price;}// 成员函数 run()void run() {cout << "车跑起来了" << endl;}// 函数声明 stop()void stop(); // 未实现,但可以在子类中实现
};// 派生类 Roadster(跑车),继承自 Vehicle
class Roadster : public Vehicle { // 跑车类
public:int stateOfTop; // 敞篷状态:0 表示关闭,1 表示打开// 派生类构造函数,使用初始化列表调用基类构造函数Roadster(string contry, double price, int state): Vehicle(contry, price) { // 调用基类构造函数cout << "派生类的构造函数被调用" << endl;stateOfTop = state;}// 派生类特有函数 openTopped()void openTopped() {if (stateOfTop == 1)cout << "敞篷已打开" << endl;elsecout << "敞篷已关闭" << endl;}// 派生类特有函数 pdrifting()void pdrifting() {cout << "漂移模式启动" << endl;}
};int main() {// 创建 Roadster 对象 FTYPE,传入制造国、价格和敞篷状态Roadster FTYPE("法国", 70, 0); // 70 单位可能是万元return 0;
}

🔍 运行结果(输出):

 

浅色版本

基类的构造函数被调用
派生类的构造函数被调用

🧠 解释:

  • Vehicle 是基类,包含通用的交通工具属性如国家 contry 和价格 price
  • Roadster 是派生类,表示跑车,新增了一个专属属性 stateOfTop(敞篷状态)。
  • 构造函数使用了初始化列表来调用父类构造函数 : Vehicle(contry, price),这是推荐的方式。
  • 在 main() 中创建 Roadster 对象时,首先调用基类构造函数初始化共性数据,然后调用派生类构造函数初始化个性数据。
  • openTopped() 和 pdrifting() 是派生类特有的功能。

✅ 总结一下两段代码的关键点:

内容说明
继承方式使用 public 继承保留基类成员访问权限
构造函数调用顺序先调用基类构造函数,再调用派生类构造函数
初始化列表推荐使用 : BaseClass(args) 来调用基类构造函数
成员函数可以继承也可以扩展新的功能
封装性派生类拥有基类所有非私有成员

如果你还想了解析构函数调用顺序、虚继承、多态、抽象类等内容,也可以继续提问 😊

相关文章:

  • MySQL中怎么看是否走了索引
  • springboot java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver应该如何解决
  • Java Spring 之拦截器HandlerInterceptor详解与实战
  • 解决方案:__cplusplus宏的值始终为199711L(即 C++98)
  • 分布式存储技术全景解析:从架构演进到场景实践
  • 循环神经网络(RNN)全面教程:从原理到实践
  • 图解深度学习 - 基于梯度的优化(梯度下降)
  • 学习STC51单片机21(芯片为STC89C52RCRC)
  • 历年西北工业大学计算机保研上机真题
  • DrissionPage WebPage模式:动态交互与高效爬取的完美平衡术
  • 使用原生前端技术封装一个组件
  • 近期手上的一个基于Function Grap(类AWS的Lambda)小项目的改造引发的思考
  • Feign服务注册到nacos 2.2.3
  • Spring中过滤器 RequestContextFilter 和 OncePerRequestFilter 的区别
  • 基于CNN的OFDM-IM信号检测系统设计与实现
  • Linux(8)——进程(控制篇——上)
  • JS浮点数精度问题
  • TypeScript 中高级类型 keyof 与 typeof的场景剖析。
  • 共享签名是什么
  • 打破建筑管理壁垒,IBMS智能系统赋能现代建筑协同增效
  • 电商平台正在建设中网站页面提示/免费发外链
  • 杭州门户网站开发/阿里云免费建站
  • 网站优化排名的方法/推广软件赚钱
  • 网站数据库查询怎么做/泉州百度竞价推广
  • 证券投资网站建设/查排名的网站
  • 做网站需要公司资质吗/seo排名优化app