C++——继承

面向对象编程的主要目的之一是提供可重用的代码,那些进过测试的代码,比重新写的要好得多,而且可以提高效率。这就是C++的主要特性之一——继承。

一、继承的主要工作:
1.可以再已有类的基础上添加功能。
2.可以给类添加数据。
3.可以修改类的方法。
下面介绍一个简单的继承关系:

class Person
{
public:
    void print()//基类里的一个方法
    {
        cout << _name << "--" << _age << "--" << _gender << endl;
    }
private:
    int _age;//年龄
    char _gender[5];//性别
    char _name[20];//姓名
};
class Student : public  Person //学生类共有继承自人类
{
private:
    int stu_num[20];//学号
    double garde;//成绩
};

学生类继承自人类,拥有人类的所有数据成员,和成员函数。
二、继承的申明格式:class Derived : (继承方式) Base {};
继承方法有一下三种:public,private,protected 三种继承方法。
1.公有继承(public):基类中公有成员和保护成员在派生类的访问权限不会发生改变,在派生类里不能访问私有成员。公有继承也是一个接口继承,每一个派生类的对象也是基类的对象。这个很好理解,也就是说每个学生也属于人类这个大的类。
2.保护继承(protected):基类中的公有成员和保护成员在派生类里变为保护成员,在派生类里不能访问基类的私有成员。
3.私有继承(private):基类里的公有成员和保护成员在派生类里变为私有成员,在派生类里不能访问基类的私有会员。
小结:
1.不管是哪种继承方法,派生类都可以访问到基类的公有和保护成员,私有成员存在但是,在派生类里访问不到。
2.其中未给出继承方式的继承 ,在class申明下为private继承,而在struct下为public继承
3.实际应用中一般使用public继承,很少数情况下使用私有和保护继承。
三、派生类里的成员函数
继承关系下,派生类里如果没有显示的给出类里边的六个隐藏成员函数,系统就会默认合成这六个成员函数,分别是:构造函数、拷贝构造函数、析构函数、赋值运算符重载、取地址操作运算符重载、const 修饰的取地址操作运算符重载。
继承关系下构造函数的调用顺序:
派生类构造函数—>基类的构造函数—>基类析构函数—>派生类的析构函数
但起执行顺序为
基类的构造函数—>派生类构造函数—>派生类的析构函数—>基类析构函数
之所以有这种顺序差别,是因为基类没有缺省构造函数时,派生类必须在初始化列表中显示的给出基类名和参数列表。
所以在执行派生类构造函数时候在参数列表位置执行了基类的构造函数。
四、赋值兼容规则
public下的赋值兼容规则:
子类对象可以直接赋值给父类对象(切片)。
父类对象不能赋值给子类对象。
父类的指针/引用能指向子类的对象。
子类的指针/引用不能指向父类的对象。
其次:友元关系不能通过继承传递下来。
五、多继承问题
单继承:一个子类只有一个直接父类,这种继承叫做单继承。
这里写图片描述
多继承:顾名思义,一个子类拥有多个父类,这种继承关系叫做多继承。
这里写图片描述
菱形继承(钻石继承):
这里写图片描述

class B
{
public:
    int _b;
};
class C1 :public B
{
public:
    int _c1;
};
class C2 :public B
{
public:
    int _c2;
};
class D :public C1, public C2
{
public:
    int _d;
};

这个菱形继承关系下 D创建的对象d的对象模型(各个成员在内存中的布局方式)先是基类里的成员,下面是自己的成员.而两个基类C1 ,C2里面都含有一个_b的数据成员。
所以在派生类D中访问_b产生二义性,不知道访问那个基类里的 _b。
为了解决这个问题引出了虚拟继承。在继承方式前面加上关键字 virtual就是虚拟继承。
虚拟继承下的派生类大小多了4个字节,里面存放一个地址。地址指向一个偏移量表格。表格里存放着相对于自己和相对于基类的偏移量。
在编译器编译的时候就加入了偏移量表格。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值