C++中类的继承
一、继承基本概念
继承是一个进程,通过继承,一个对象可以获得另一个对象的属性(包括函数),并可向其中加入属于自己的一些特征。作为C++语言的一种重要机制,用继承的方法可以自动为一个类提供来自另一个类的操作和数据结构,进而使程序设计人员在一个一般的类的基础上很快建立一个新的类,而不必从零开始设计每个类。
当一个类被其他的类继承时,被继承的类称为基类,又称为父类。
继承其他类属性的类称为派生类,又称为子类。
一般情况下,继承的进程起源于一个基类的定义,基类定义了其所有派生类的公有属性。从本质上讲,基类具有同一类集合中的公共属性,派生类继承了这些属性,并且增加了自己特有的属性。从任何已存在的类继承的实质就是建造新的派生类。
二、继承语法
class 子类类名 :继承方式 父类类名
{
};
三、继承方式
1.public 公有继承
父类成员属性 | 子类成员属性 |
---|---|
public | public |
private | private |
protected | protected |
2.private 私有继承 | |
父类成员属性 | 子类成员属性 |
– | – |
public | private |
private | private |
protected | private |
3.protected 保护继承
父类成员属性 | 子类成员属性 |
---|---|
public | protected |
protected | protected |
private | private |
四、单继承、多继承和继承链
1.单继承:
从一个基类派生的类,称为单继承,即派生类只有一个父类,语法同上
2.多继承:
从多个基类派生的子类,称为多继承,即派生类有多个父类
class 子类类名:继承方式 父类类名1,继承方式 父类类名2···
{
};
菱形继承便是多继承一个很好的例子
菱形继承:
比如:
若动物这个基类中有成员变量m_age,则羊驼这个类在继承的时候将m_age这个成员变量继承了两次,并且分别存在于羊和驼这两个类中,所以就出现两个问题:
(1)m_age变量的访问
(2)多继承导致内存空间的浪费
解决方式:
(1)可以在变量前加作用域来访问
(2)在羊和驼继承时,在继承方式前加 virtual ,变为虚继承,则公共基类动物则称为虚基类,此时,羊驼继承的羊和驼这两个父类不再是两个m_age,而是一个指向同一个m_age的虚拟指针,此时便不再占用两份空间,就可以解决浪费空间的问题,并且在访问m_age时就可以不用加作用域
3.继承链:
如上面从动物到羊再到羊驼,这便是一个简单的继承链,即A类派生B类,B类派生C类,则称A是B的直接基类,B是C的直接基类,A是C的间接基类
五、多继承时构造函数和析构函数的调用
以上面动物->羊->羊驼为例
1.构造函数:
先调用动物这个类中的构造函数,再调用羊的构造函数,最后是羊驼,当继承链更长时也是同理
2.析构函数:
与构造函数调用顺序相反
六、子类与父类中同名成员的访问
- 子类:直接访问,不用加作用域
- 父类:需要在前面加上作用域
- 静态成员与上面一致
(新人一枚,均是学习心得,有不对的地方还请指点,不喜勿喷,谢谢)