类的继承和派生(自我总结)
在派生类中:
无论是哪种继承都不可以直接访问上一级类继承下来私有成员
- 不可以直接访问
- public
- protected
对于protect和public则根据继承方式的不同而不同, 继承方式的不同限制的是派生类对象对基类的访问。
在派生类内部中:
- 无同名函数
- 可以访问除开基类私有成员的任何成员
- 有同名函数(同名就行)
- 派生类中的同名函数隐藏基类中的同名函数
- 可以通过类名::函数进行区分
- 可能会引发二异性(继承来的函数同名[同一等级])
protected继承与private继承的差别:
- protected不会继承到没有 ——
- private会继承到不能访问 \
- 只继承一次是看不出来差距的
类型转换
公有派生类对象(public方式)可以被当作基类的对象使用,反之则不可以.
- 公有派生使得基类的对外访问接口是不变的
- 派生类的对象可以隐含转换为基类对象;
- 派生类对象可以初始化基类的引用
- 派生类的指针可以隐含转换为基类的指针
通过基类对象名、指针只能使用从基类继承的成员
不要重新定义继承而来的非虚函数,使得同名函数被覆盖掉,使用虚函数更加满足多态需求
派生类不能继承的基类成员
缺省构造函数,拷贝构造函数,拷贝赋值函数,以及析构函数这四种成员函数被称作特殊的成员函数
构造函数
未继承基类构造函数,那么使用派生类构造函数进行统一初始化
C++11规定:
- 可用using 语句继承基类的构造函数
- 但是只能初始化从基类继承的成员
- 语法形式:
- using B::B;
复制构造函数与析构函数都是不被继承的,只会在需要的时候被调用。
复制构造函数一个派生类对象要被传递多次,中间会进行类型转换
析构函数与构造函数执行顺序相反
虚基类(与虚函数性质有些区别)
虚基类处理基类冗余的问题,虚函数处理函数动态绑定以区分调用的是那个函数
- 虚基类————>虚继承,用virtual修饰第一次继承的继承方式,这样继承的就是指向该类的指针(形成虚基类)
- 每个继承下来的虚基类都要被进行初始化(普通的不用)
- 解决了冗余问题,但必须知道虚基类名以进行初始化
- 最远派生类在被生成时,直接调用该虚基类,对虚基类只初始化一次
虚函数
- 虚表是存在的,用来存放虚函数的入口地址(我怀疑有同名函数才会进入虚表,否则virtual就是一个标志)
- 虚函数是动态绑定
- 虚函数成员也有非静态成员函数的性质,会对同名的继承函数进行覆盖(无论述虚函数还是普通函数)
- 如果跟基类虚函数同名,那么该函数除非返回类型以及参数类型及个数都一样才是虚函数,否则不是虚函数
- 如果派生类中新定义了一个虚函数,且不与基类中的同名,那么通过基类指向派生类的基类指针或引用是找不到该虚函数的
总结:1.虚函数是用给继承中是同名函数的函数,以达到动态绑定效果,如果没有同名函数,那么带virtual与不带的差不多;
虚析构函数比较特殊,不用一样也能进入虚表
2.无论是虚函数还是虚析构函数,基类通过指针或者引用的情况才进行动态绑定,如果直接进行复制初始化,那么基类还是只调用基类的成员