继承

1.什么是继承?
继承是面向对象编程提供可重用代码的重要手段 ,它允许我们在保持原有类特性的基础上,对原有类进行拓展和修改派生出新的类,从已有类(基类/父类)派生出新的类称为派生类(子类)。
继承类定义的格式:class 派生类名称:继承类型(pub/pro/pri) 基类名称
其继承类型有三种:public,private和protected,默认为private。

2.派生类的特征

  • 派生类必须继承基类的所有成员(不包括构造函数,析构函数和赋值运算符重载),即派生类继承了基类的实现和接口。
  • 派生类可以根据自己的需要额外添加数据成员和成员函数。
  • 派生类需要自己的构造函数和析构函数。

3.派生类的访问权限
派生类成员函数对基类成员函数的访问权限取决于基类对基类成员的权限和派生类的继承方式,
具体如下表格:

这里写图片描述
public:派生类内和对象都可访问
protected:派生类内可访问,对象不可访问
private:派生类内可访问
不可见:都不可访问
如果想访问基类private成员函数,可以通过基类public接口来访问。
public继承是is-a的关系,即每一个派生类对象都是一种基类对象,反之不成立.就像学生是人而人不一定是学生的关系。

4.派生类的默认成员函数
在继承关系里,派生类如果没有显示的定义这六个成员函数(构造函数,拷贝构造函数,析构函数,赋值运算符重载,取地址操作符重载,const修饰的取地址操作符重载),编译器会默认合成。
派生类构造函数的初始化表达式:派生类构造函数名(参数列表):基类构造函数名(参数列表){派生类构造函数体}
在进入新类的构造函数体之前调用所有其他基类的构造函数,如果无法调用基类的构造函数,就无法继续往下进行。
派生类构造函数的调用次序:
这里写图片描述
派生类析构函数的调用次序:
这里写图片描述

5.派生类和基类之间特殊关系
基类指针(引用)可以在不用显式转化的情况下指向(引用)派生类对象,但是不可以将基类对象和地址赋给派生类指针和引用(可强转)。
同样的派生类对象可以赋值给基类对象,基类对象不能赋值给派生类对象。

6.名字隐藏
在继承体系中,基类和派生类是两个不同的作用域,如果派生类和基类中有同名成员,派生类成员将屏蔽基类对成员的直接访问(在派生类成员函数中,可以使用基类::基类成员访问),所以在继承体系中最好不要定义同名成员。
这里写图片描述

7.多重继承
通过多个基类来创建一个新类。
例如class D:public B1,public B2{//D的新增成员};,类D同时继承了B1和B2。
多重继承的构造函数与单继承的类似,例如类D的构造函数为D():B1(),B2(){//构造函数体}
菱形继承:这里写图片描述

下面是一段菱形继承的代码:

class B
{
public:
    void Bfun();
};

class C1:public B
{
public:
    void C1fun();
};

class C2:public B
{
public:
    void C2fun();
};

class D:public C1,public C2
{
public:
    void Dfun();
};

int main()
{
    D d;
    d.Bfun();
    return 0;
}

这段代码编译器会报出一个错误:对“Bfun”的访问不明确。这是因为菱形继承中存在一个二义性问题,当通过派生类D调用基类B中的Bfun()函数时,编译器并不清楚是通过C1还是通过C2来调用基类里面的函数。正确的做法是,再派生类里面调用基类成员函数时加上作用域限定符,例如d.C1::Bfun();
但是这样代码会显得冗杂,我们可以用另一种方法来解决二义性问题-虚继承
这里写图片描述
这样,虚继承解决了在菱形继承体系里面子类对象包含多份父类对象的数据冗余&浪费空间的问题。虚继体系看起来很复杂,在实际应用我们通常不会定义如此复杂的继承体系。一般不到万不得已都不要定义菱形结构的虚继承体系结构,因为使用虚继承解决数据冗余问题也带来了性能上的损耗。
知道类虚基类,那么对象初始化顺序可以完整的给出了。
对象初始化顺序:(注:《c++编程思想》P828)
1)所有虚基类子对象,按照他们在类定义中出现的位置,从上到下从左到右进行初始化
2)然后非虚基类按照通常顺序初始化。
3)所有成员对象按声明顺序初始化。
4)完整的对象的构造函数的执行。

7.其他
- 友元关系不能继承,基类友元不能访问派生类私有和保护成员
- 基类定义了static成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有
一个static成员实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值