
C++ 继承 详解
基类的私有成员在派生类中不可见。 使用 避免使用 基类和派生类具有独立的作用域。 子类成员会屏蔽父类同名成员。 隐藏关系只需名称相同。 构造函数:调用基类构造函数初始化基类成员。 拷贝构造函数:调用基类拷贝构造。 赋值运算符(`operator=``):调用基类赋值。 析构函数:清理派生类成员后调用基类析构。
发布日期:2021-05-15 01:06:07
浏览次数:7
分类:精选文章
本文共 1862 字,大约阅读时间需要 6 分钟。
继承机制入门
一、什么是继承?
继承是面向对象程序设计中代码复用最重要的手段。通过继承,可以在保持基类特性的同时,扩展功能,产生新的类——派生类。这种机制使代码更加灵活且具有可复用性。
1.1 概念
继承机制允许派生类在基类的基础上增添新的属性和行为。例如,Person
是基类,Student
是派生类。通过继承,派生类可以利用基类的功能,同时定义自己的独特逻辑。
1.2 定义
- 基类:定义了继承关系的类,被继承的类。
- 派生类:继承基类,扩展功能的类。
1.2.1 继承关系和访问限定符
继承关系决定了派生类对基类成员的访问级别。默认情况下,class
关键字使用私有继承(private
),struct
使用公有继承(public
)。建议always显式声明继承方式,以避免歧义。
1.2.2 继承基类成员访问方式的变化
- 私有成员:基类的私有成员在派生类中始终不可见。
- 保护成员:派生类可以访问基类的保护成员,但反之则不然。
- 公有成员:派生类可以直接访问基类的公有成员。
注意事项
public
继承是最常见的选择。protected
或 private
继承,除非有特殊需求。二、基类和派生类对象赋值转换
可赋值关系
- 派生类对象可以赋值给基类:通过切割(拷贝基类成员)。
- 基类对象不能赋值给派生类:如直接赋值会导致类型不匹配。
强制转换
- 基类指针可以通过
dynamic_cast
安全转换为派生类指针。 - 使用
RTTI
检测对象类型后再进行转换。
示例
Student sobj;Person pobj = sobj; // 可以赋值Person* pp = &sobj;Person& rp = sobj;// 错误示例sobj = pobj; // 基类对象不能赋值给派生类对象
三、继承中的作用域
作用域特点
示例
class Person {protected: string _name; int _num;};class Student : public Person {public: void Print() { cout << " 姓名: " << _name << endl; cout << " 身份证号: " << _num << endl; cout << " 学号: " << _num << endl; }};
四、派生类的默认成员函数
派生类会自动生成以下默认成员函数:
调用顺序
- 构造函数:基类 → 派生类。
- 析构函数:派生类 → 基类。
五、继承与友元
友元关系不能继承:
- 基类友元无法访问派生类的私有或保护成员。
六、继承与静态成员
静态成员在继承中仅有一个:
- 基类定义的静态成员,派生类无法继承。
七、菱形继承
单继承
- 一个子类只有一个直接父类。
多继承
- 子类有两个或以上直接父类。
菱形继承
- 子类有两个或以上父类,导致数据冗余和二义性。
虚拟继承
- 使用
virtual
关键字解决菱形继承的二义性问题。 - 虚基表存储偏移量,解决数据冗余。
八、继承与组合
继承(is-a)
- 派生类对象是基类对象,高耦合度。
组合(has-a)
- 派生类包含基类对象,低耦合度。
优先原则
- 综合使用对象组合而非类继承,除非有特殊需求。
示例
class Car {protected: string _color; string _num; Tire _tire;};class BMW : public Car {public: void Drive() { cout << "好开-操控" << endl; }};class Benz : public Car {public: void Drive() { cout << "好坐-舒适" << endl; }}class Tire {protected: string _brand; size_t _size;};
通过以上内容,可以清晰地理解继承的核心概念及其实际应用。
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年05月02日 12时54分44秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
[源码解析] 消息队列 Kombu 之 基本架构
2019-03-06
[源码分析] 消息队列 Kombu 之 启动过程
2019-03-06
[源码分析] 消息队列 Kombu 之 Consumer
2019-03-06
抉择之苦
2019-03-06
wx.NET CLI wrapper for wxWidgets
2019-03-06
ASP.NET MVC Action Filters
2019-03-06
Powershell中禁止执行脚本解决办法
2019-03-06
HTTP协议状态码详解(HTTP Status Code)
2019-03-06
OO_Unit2 多线程电梯总结
2019-03-06
04_Mysql配置文件(重要参数)
2019-03-06
python 序列化及其相关模块(json,pickle,shelve,xml)详解
2019-03-06
JavaSE总结
2019-03-06
手动造轮子——基于.NetCore的RPC框架DotNetCoreRpc
2019-03-06
Python IO编程
2019-03-06
CSS入门总结
2019-03-06
使用 TortoiseGit 时,报 Access denied 错误
2019-03-06