继承、派生与多态
继承与派生
1.继承
https://www.bilibili.com/video/av3474141/?p=1
-
B拥有A的全部特点,B可以做派生类,A为基类。
-
派生类可对基类进行扩充和修改。
-
派生类继承基类的全部成员函数和成员变量,但是派生类的成员函数不能访问基类的私有(private)成员变量。
-
写法: class 派生类:public 基类
-
举例:学籍管理
-
内存空间
-
派生类对基类成员函数的覆盖(同名同参数表的成员函数)
2.继承关系与复合关系
-
继承关系:B是A的派生类,则逻辑上要求一个B对象也是A的对象
-
复合关系:类C中有成员变量k,k是类D的对象,则C和D是复合关系。逻辑上要求D对象是C对象的固有属性或组成部分。
需要定义为友元,便于CCircle访问Cpoint中的私有成员变量。
常见错误:循环定义!编译不通过。
正确写法:两个类之间通过指针定义成员变量(互相知道)
3.基类和派生类同名对象和成员函数的情况
不能访问基类的私有成员变量
访问范围说明:
- 基类的private成员可被基类的成员函数和友员函数访问
- 基类的public成员可被以下函数访问:
- 基类的成员函数
- 基类的友员函数
- 派生类的成员函数
- 派生类的友员函数
- 其他函数
- 基类的protected成员可被以下函数访问:
- 基类的成员函数
- 基类的友员函数
- 派生类的成员函数可以访问当前对象的基类的保护成员
4.派生类的构造函数
- 执行派生类的构造函数前先执行基类的构造函数
-
调用基类构造函数的两种方式
- 显示方式
- 隐式方式(不特意声明,调用基类默认的构造函数)
-
调用析构函数时先调用派生类的析构函数再调用基类的析构函数
-
执行派生类的构造函数之前:调用基类函数的构造函数,初始化被继承的那部分成员变量和成员函数。
5. public继承的赋值兼容规则
- 派生类对象可以赋值给基类对象
- 派生类对象可以初始化基类引用
- 派生类对象的地址可以赋值给基类指针
- 若派生方式为private或protected,则上述三条不成立
6. 直接基类和间接基类
定义和构造函数只需要指明直接基类。
多态
提高程序的可扩充性
1. 虚函数和多态