C++ 一篇搞懂继承的常见特性

发布于 2020-9-2 14:30
浏览
0收藏

继承和派生
继承和派生的概念
继承:

在定义一个新的类 B 时,如果该类与某个已有的类 A 相似(指的是 B 拥有 A 的全部特点),那么就可以把 A 作为一个基类,而把B作为基类的一个派生类(也称子类)。

派生类:

派生类是通过对基类进行修改和扩充得到的,在派生类中,可以扩充新的成员变量和成员函数。
派生类拥有基类的全部成员函数和成员变量,不论是private、protected、public。需要注意的是:在派生类的各个成员函数中,不能访问基类的private成员。

继承关系和复合关系
类之间的两种关系
继承的关系是「是」的关系:

基类 A,B 「是」基类 A 的派生类。
逻辑上要求:一个 B 对象也「是」一个 A 对象。

继承的关系是「有」的关系:

C 类中「有」成员变量 i,i 成员变量是 D 类的,则 C 和 D 是复合关系。
逻辑上要求:D 对象是 C 对象的固有属性或组成部分。

 

 指针对象和对象的区别
如果不用指针对象,生成 A 对象的同时也会构造 B 对象。用指针就不会这样,效率和内存都是有好处的。

比如:
class Car
{
    Engine engine; // 成员对象
    Wing * wing;   // 成员指针对象
};

定义一辆汽车,所有的汽车都有 engine,但不一定都有 wing 

这样对于没有 wing 的汽车,wing 只占一个指针,判断起来也很方便。

空间上讲,用指针可以节省空间,免于构造 B 对象,而是只在对象中开辟了一个指针,而不是开辟了一个对象 B 的大小。
效率上讲,使用指针适合复用。对象 B 不但 A 对象能访问,其他需要用它的对象也可以使用。
指针对象可以使用多态的特性,基类的指针可以指向派生链的任意一个派生类。
指针对象,需要用它的时候,才需要去实例化它,但是在不使用的时候,需要手动回收指针对象的资源。

 

派生类覆盖基类成员
覆盖
派生类(子类)可以定义一个和基类(父类)成员同名的成员,这叫「覆盖」。在派生类(子类)中访问这类成员时,默认的情况是访问派生类中定义的成员。要在派生类中访问由基类定义的同名成员时,要使用作用域符号::。

 

继承的赋值兼容规则

01 public 继承

1.派生类的对象可以赋值给基类对象

2.派生类对象可以初始化基类引用

3.派生类对象的地址可以赋值给基类指针

==注意:如果派生方式是 private 或 protected,则上述三条不可行==

 

02 protected 和 private 继承

protected 继承时,基类的 public 成员和 protected 成员成为派生类的 protected 成员;
private 继承时,基类的 public 成员成为派生类的 private 成员,基类的 protected 成员成
为派生类的不可访问成员;

protected 和 private 继承不是「是」的关系。

所以派生方式是 private 或 protected,则是无法像 public 派生承方式一样把派生类对象赋值、引用、指针给基类对象。

 

03 基类与派生类的指针强制转换

public 派生方式的情况下,派生类对象的指针可以直接赋值给基类指针

Base *ptrBase = & objDerived;

ptrBase 指向的是一个 Derived 派生类(子类)的对象
*ptrBase 可以看作一个 Base 基类的对象,访问它的 public 成员直接通过 ptrBase 即可,但不能通过 ptrBase 访问 objDerived 对象中属于 Derived 派生类而不属于基类的成员。

通过强制指针类型转换,可以把 ptrBase 转换成 Derived 类的指针

程序员要保证 ptrBase 指向的是一个 Derived 类的对象,否则很容易会出错。

收藏
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐