目录
一、继承
- 面向对象三大特性:(严格来说不止三种)最重要三种封装、继承、多态, 其他:抽象、反射(Java)。
- 封装本质是一种更好的管理,相比c语言面向过程,数据和方法都放到类中进行管理,在通过访问限定符进行限制。
- 相对C语言面向过程,数据和方法都放到类中进行管理,再通过访问限定符进行限制。
(一)概念
继承是为了从类设计的角度避免重复定义数据和方法,进行类角度的复用。
(二)父类在子类中的访问方式
- 在子类的访问方式=权限min(基类的访问方式,继承方式)public>protected>private
- 基类的private成员,在子类中都不可见。本质意义是说,我想在子类中用父类变量就不能用,但是通过父类函数调用父类私有参数就可以用。常考考点!!!
- 语法层面不能对变量改,可以取地址,强转int*就可以改。
- 继承的protected变量可以在类里用,不能在类外用。
- 想让子类用就定义公有或者保护,不想让子类用就定义保护,保护和公有区别就是保护不能在类外用,公有可以在类外用。
- 想复用就定义公有,想在类内随便用就定义保护。
- 最常用的是两种,公有继承父类的公有和保护成员。保护继承和私有继承最不常用。
- class默认继承方式是私有,struct默认继承方式是公有。
(三)基类和派生类对象赋值转换
int main()
{
Person=p;
Student=s;
p=s; //子类对象赋值给父类对象,切割切片。
return 0;
}
- p基类 s子类 p=s 子对象赋值给父类对象 ,存在切割、切片。
- 引用和指针都是一样 切割切片。
父类的指针或者引用是可以转回子类类型指针或者引用,但是子类无法转回父类,不安全存在风险。
指针的意义就是看能否看到几个字节空间,比如int*只能看到4个字节空间,char*只能看到一个字节空间。基类指针指向父类相当于看到的空间多了,但是能正常访问,子类指针转回父类,相当于多看到空间了,存在越界。
所有讲的赋值继承都只存在与公有继承,比如父类原本是公有,通过保护继承子类变成保护继承,如果在赋值后,父类成员是公有的,子类成员是私有的,就矛盾了。私有和保护继承是不存在的。所以实际中很少使用私有和保护继承。
(四)继承中的作用域(也是一个C++缺陷)
- 在继承体系中基类和派生类都有独立的作用域。
- 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。
- 注意在实际中在继承体系里面最好不要定义同名的成员。
- 重载(函数重载,函数名必须在同一作用域) 重写(覆盖) 重定义(隐藏,函数名相同是在不同作用域将会构成隐藏)。
- 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。