继承
- 基本语法
- class 子类:继承方式 父类
class Base{ }; class New:public Base{ }
- 继承方式
- 公有继承
- 父类中的public和protected在子类中性质不变继承,private子类不可继承
- 保护继承
- 父类中的public和protected均变为子类中的protected,private子类不可继承
- 私有继承
- 父类中的public和protected均变为子类中的private,private子类不可继承
- 我们要注意虽然子类的private不可以在子类中再次调用使用,但是其依然存在占用sizeof
- 公有继承
- 继承中构造和析构顺序
- 先base构造后son构造
- 先son析构后son析构
- 继承同名成员的处理方式
- 问题
- 当子类和父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢
- 访问子类同名成员 直接访问即可
- 访问父类同名成员 需要加作用域
- 如果子类中出现和父类同名的成员函数,子类的同名成员函数会隐藏掉父类中所有同名成员函数
class Base{ public: int num; Base(){ num = 10; } void func(void){ cout << "Base-func" << endl; } void func1(void){ cout << "Base-func1" << endl; } }; class Son:public Base{ public: Son(){ num = 20; } void func(void){ cout << "Son-func" << endl; } void func1(void){ cout << "Son-func1" << endl; } }; void test01(void){ Son s; cout << s.num << endl; cout << s.Base::num << endl; s.func(); s.Base::func(); }
- 问题
- 继承同名静态成员处理方式
- 继承中同名的静态成员在子类对象上如何进行访问
- 静态成员和非静态成员同名,处理方式一致就如上所示加入作用域
- 静态成员其实直接通过类访问,不一定非要对象
- 解释 Son::Base::m_A的意义
- 第一个代表通过类访问方式直接访问静态成员
- 第二个代表父类的作用域下
- 多继承语法
- 语法
- class 子类:继承方式 父类1, 继承方式 父类2…{}
- 多继承可能会引发父类中有同名成员出现,需要加作用域区分
- 语法
- 菱形继承
- 两个派生类继承同一个基类
- 又有某个类同时继承两个派生类
- 这种继承被称为菱形继承
- 解决
- 虚继承—在继承之前加上关键字virtual编程虚继承—被继承最大的类叫虚基类
- 虚继承本质上将数值继承改变成为了指针访问基类对应位置,这样内存开辟其实只是一个特定的区域,而访问时通过指针偏移进行的(vbptr)
class Animal{ public: int age; } class Sheep:virtual public Animal{}; class Tuo:virtual public Animal{}; class SheepTuo:public Sheep, public Tuo{}; void test(){ SheepTuo st; st.Sheep::age = 100; st.Tuo::age = 200; cout << st.Sheep::age << endl; cout << st.Tuo::age << endl; cout << st.age << endl; }
- 以上代码均输出200,本质上就是继承了虚指针,指向同一片区域
- 有效解决了资源浪费的问题