C++知识点12:继承和组合

继承特性:

依据一个或多个基类来定义一个新的派生类(子类获得父类特性)

作用:

程序易于创建和维和;重用代码功能;提高执行时间(创建新类时不需要重新编写新的数据成员和成员函数)

继承控制访问:

派生类可以访问基类中所有的非私有成员,一个派生类继承了所有的基类方法,但下列情况除外:
基类的构造函数、析构函数和拷贝构造函数。
基类的重载运算符。
基类的友元函数

继承类型:

1.公有继承public:基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员(保护成员用派生类的成员函数访问)
2.保护继承protected:基类的公有保护成员将成为派生类的保护成员
3.私有继承private:基类的公有保护成员将成为派生类的私有成员

继承内存空间分布:

成员变量的声明顺序分布内存。
单继承内存分布:
这里写图片描述
每个派生类复制一份基类的成员变量。基类的数据放在派生类之前。派生类指针B和基类指针A指向同一个地址。
多继承内存分布:
这里写图片描述
派生类分别拷贝两个基类的成员变量。基类A的指针和派生类C的指针指向同一个位置,基类B的指针指向不同。(派生类和基类之间偏移量固定)
虚继承内存分布:
由于派生类和虚基类之间偏移量不固定,所以需要在类中定义一个虚基类表指针,存储类中对象指针和虚基类表指针之间的偏移量。
虚基类表指针->指向偏移量表->偏移量表中存储对象指针与虚基类表指针之间的偏移量

class A
class B:public virtual A

这里写图片描述
如图所示,对象B的指针和虚基类表指针重合,所以虚基类表指针和对象B指针偏移量为0;
对象A指针和虚基类指针之间隔着一个虚基类指针和派生类B的成员变量,因此偏移量为虚基类指针+派生类成员变量内存

class A;
class B:public virtual A;
class C:public virtual A;
class D:public B,public C;

其中class B:public virtual A
这里写图片描述
class C:public virtual A
这里写图片描述
class D:public B,public C
这里写图片描述

多继承:

一个子类可以有多个父类,它继承了多个父类的特性

class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};

多继承的优缺点:

缺点:多重继承情况下成员访问的二义性
优点:重复利用

多个父类中有同名函数,如何确定子类覆盖哪一个父类的函数?使用形式“类名::函数名

class A{void foo()};
class B{void foo()};
class C:pubilc A,public B{};

C c;
c.A::foo();
c.B::foo();

虚继承:

这里写图片描述
类C继承类A和类D,而类A和类D都继承类B,因此在类C中存在两份类B的拷贝。即浪费存储空间;又存在二义性。虚继承节省内存空间

虚继承形式:

B是虚基类,类A和类D对B虚继承,类C多重继承

class B;
class A:public virtual B;
class D:public virtual B;
class C:public A,public D;
};

组合:

在逻辑上A是B的一部分,则不允许B从A派生,而是要用A和其它东西组合出B
重用原类的内部实现即原类是新类的一部分用组合;
若需要原类的内部实现还要重用接口用继承
P151代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值