/* 继承
* 主要作用:减少代码冗余,增加复用。
* 语法:`class Son :public Base {};`
* - 其中Son称为子类或派生类;
* - Base称为父类或基类;
*
* 派生类中的成员,包含两部分:
* (1)一类是从基类继承过来的,一类是自己的成员;
* (2)从基类继承过来的表现其共性,而新增的成员体现了其个性。
*
* 继承方式一共有三种:
* (1)公共继承;
* - 公共继承方式基类成员可访问性不变:基类公共成员(public)在子类中变成了公共成员,保护成员(protected)到了子类则依然是保护成员,
* 而私有成员(private)还是私有成员,私有成员子类不可访问;
* (2)保护继承;
* - 保护继承则是基类的公共成员和保护成员在子类中均成了保护成员,权限变为了保护权限(类外不可访问),而基类私有成员(private)则是不变,
* 子类依然不能访问;
* (3)私有继承;
* - 私有继承则是基类的公共成员和保护成员在子类中均成了私有成员,子类可以访问,但是基类私有成员(private)则是不变,子类依然不能访问;
* 注:可以看出,无论是哪种继承方式,子类都不能访问基类的私有成员。
*
* 继承中的对象模型
* 在父类中的所有非静态成员都会被子类继承下去,父类中私有成员属性虽然被编译器隐藏子类访问不到,但是确实被继承下去了
*
* 继承中的构造和析构顺序:
* - 构造时,先构造父类,后构造子类;
* - 析构时,先析构子类,后析构父类;
* - 析构顺序与构造顺序相反。
*
* 继承同名成员处理方式:
* 问题:当子类与父类出现同名成员时,如何通过子类对象,访问到子类或父类中同名的数据?
* (1)访问子类成员,直接访问即可;
* (2)访问父类成员,需要加作用域(如 `Son.Base::m_age`访问父类属性m_age, `Son.m_age`访问自身属性m_age)。
* 如果子类中出现和父类中同名的成员函数,子类的同名成员会隐藏掉父类中【所有同名成员函数】,如果想访问父类中被隐藏的同名成员函数,需要加作用域。
*
*
* 继承同名静态成员处理方式(静态成员:类内定义,类外赋值)
* 问题:继承中同名的静态成员在子类对象上如何进行访问"
* 答:静态成员和非静态成员同名处理方式一致:
* - 访问子类同名成员,直接访问即可,无需加作用域;
* - 访问父类同名成员,则需要加上父类作用域;
*
*
* 多继承语法
* C++允许一个类继承多个类
* 语法:class 子类 :继承方式 父类1,继承方式 父类2,继承方式 父类3 ...
* 多继承可能会引发父类中有同名成员出现,需要加作用域区分。
*
*
* 菱形继承
* 概念:两个派生类继承同一个基类,又有某个类同时继承着两个派生类,这种继承称为菱形继承或钻石继承。
*
* 当菱形继承两个父类拥有两分相同数据,需要加作用域加以区分。而我们只需要一份数据就可以,菱形继承导致数据冗余浪费。
* 利用虚继承可以解决继承的上述问题。
* 虚继承:
class Animal
{
public:
int m_Age;
};
//继承前加virtual关键字后,变为虚继承
//此时公共的父类Animal称为虚基类
class Sheep : virtual public Animal {};
class Tuo : virtual public Animal {};
class SheepTuo : public Sheep, public Tuo {};
*
*
*
*
*/
黑马C++视频笔记《继承》
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...