C++继承与多态(一)
来源:互联网 发布:网络枪支案件判刑 编辑:程序博客网 时间:2024/05/22 03:46
一、继承相关概念
1.继承:继承是面向对象复用的重要手段。通过继承定义一个类,继承是类型之间的关系建模,共享共有的东西,实现各自本质不同的东西。
2.成员访问限定符与继承的关系
继承是一种复用手段,在继承关系里基类继承派生类的成员,由此打到复用目的。
三种继承关系下基类成员在派生类的访问关系变化
总结:
1)基类的私有成员(private)在派生类中是不能被访问的,如果一些积累成员不想被基类对象直接访问,但需要在派生类中能访问,就定义为保护成员。保护成员限定符是因继承才出现的。
2)public继承是一个接口继承,保持is-a原则,每个父类可用的成员变量子类也可以用,因为每个子类对象也都是一个父类对象。
3)protect/private继承是一个实现继承,基类的部分成员并未完全成为子类接口的一部分,是has-a的原则,一般情况下使用共有继承。
4)无论哪种继承方式,在派生类内部都可以访问基类的公有成员和保护成员,但是基类的私有成员存在但是在子类中不可见,不能访问。
5)使用关键字class默认继承方式是private,使用struct时默认继承方式是public。
6)实际运用中一般使用public继承。
3.继承与转换(赋值兼容规则-public继承)
1)子类对象可以赋值给父类对象(切片/切割)
2)父类对象不能赋值给子类对象
3)父类的指针/引用可以指向子类对象
4)子类的指针/引用不可以指向父类对象(可强转)
4.继承体系中的作用域
1)在继承中基类和派生类都有独立的作用域。
2)子类和父类中有同名成员,子类成员将屏蔽父类对成员的直接访问。
隐藏/重定义:子类中定义了和父类同名的成员。
可以调用父类成员用作用域解析符来访问父类成员。
3)注意在实际中最好不要定义同名成员。
二、派生类的默认成员函数
1.构造函数
合成构造函数:派生类只初始化自己的成员,父类部分调用父类的构造函数进行初始化。
Student(const char*name,int num) :Person(name)//调用父类构造函数 ,_num(num){}
2.拷贝构造函数
//s2(s1)
Student(const Student& s) :Person(s) ,_num(s._num){}
3.值操作符重载
//s2=s1
Student& operator=(const Student& s){ if(this!=&s) { Person::operator=(s); _num=s._num; } return *this;}
4.析构函数
不需要显式调父类,父类的析构函数是子类析构函数完成后自动调用的。
三、单继承和多继承
1.单继承:一个子类只有一个直接父类
2.多继承:一个子类有两个或两个以上直接父类
菱形继承:
菱形继承会存在二义性和数据冗余的问题
//解决二义性,没有解决数据冗余Assistant a;a.Student::_name="wo"a.Teacher::_name="ni"
虚继承:解决菱形继承的二义性和数据冗余的问题
阅读全文
0 0
- 继承与多态(一):使用继承扩展类
- Java 继承与多态(一)
- C++继承与多态(一)
- C++--继承与多态
- C语言面向对象编程(一):封装与继承
- C语言面向对象编程(一):封装与继承
- C语言面向对象编程(一):封装与继承
- C语言面向对象编程(一):封装与继承
- C语言面向对象编程(一):封装与继承
- JAVA第九弹(继承与多态<一>)
- 【c++知识归纳】继承与多态(一)
- C中的继承与多态
- C#(二) -继承与多态
- 【C#】C#继承与多态
- Objective-c:封装、继承与多态
- C语言实现继承与多态
- 继承与派生(一)
- (一三八)多态公有继承
- vector
- HTML块级标签的补充
- 关于技术博客文章目录
- 链表的一些操作
- 相机标定 calib3d 学习笔记
- C++继承与多态(一)
- R实战:【绘图】R中的颜色Chart of R Colors
- 【Docker】win10环境下安装Docker
- 算法-->字符串数组(快 排)
- bzoj3289 树状数组+莫队
- 欢迎使用CSDN-markdown编辑器
- Struts学习笔记
- MySQL入门之扩展匹配符、order by、limit、union、group by、having子句
- DXEIPL