C++基础(三)

一、类之间的关系

1、包含关系

构建顺序与析构顺序相反。

2、友元关系

友元函数:在类的内部:使用friend + 类外某个函数的声明,即声明了某个函数为本类的友元函数。
特性:当友元函数中有本类的对象时,在友元函数中对象或指针访问类中的属性时是不受访问权限的约束的。
友元类:在类中使用friend关键字去声明某个类为本类的友元类。

3、继承关系

(1)class 子类 : 继承权限1,父类1,继承权限2,父类2,… 继承权限n,父类n {};
(2)当子类中有与父类同名属性或函数时,子类中会把父类中的同名属性或函数将自动隐藏在自己的父类的类域之中,如果想访问父类类域之中的属性或方法,请使用域名::访问。
(3)继承关系下的类型兼容规则:is_a关系: 子类是一个父类的一个拓展。
继承关系下的类型兼容规则的语法:
<1>父类指针或引用可以天然且安全,(无需进行类型转型的)指向或引用子类类型的对象。反之则不成立。
<2>当父类中没有有默认的构造时,应该在子类的构造函数的初始化列表中进行指定。
<3>父类指针只能调用子类类域中所包含的父类中的类域中的方法或属性。所以也存在一个问题:
<4>如果使用父类指针在释放资源时,请注意要强转成子类指针才可以完全释放,不然就泄漏了。
(3.1)特殊继承关系:菱形继承
当出现棱形继承时,使用虚继承可以避免棱形继承关系中的顶层基类被构造多次的问题。
他的解决方式是依赖于虚基表指针与虚基表的关系完成。
当使用虚继承时,在直接继承子类之中,编译器就会按插一根虚基表表指针。
虚基表指针:保存虚基表地址的一个指针。
虚基表:保存虚指针表指针到虚基类中属性的偏移量。

二、多态

多态就是同名函数的不同的执行逻辑。此时的多态是动态多态,也人称之为绑定多态。

1、多态形成条件:

1.首先要有继承关系;
2.父类中要有虚函数,子类中要完成对父类虚函数的重写;
3.使用父类指针或引用,指向或引用子类实例。

1.1虚函数

类中的成员函数前加 virtual 进行修饰就是一个类中的虚函数。构造函数不可以使用virtual进行修饰。
子类中对重写函数后面加上 override 关键字。

1.2虚函数、虚函数表指针、虚函数表三者之间的关系

虚函数表指针:即当类中的成员函数使用virtua修饰时,编译器会在类中安插一个虚指针,这个虚指针就是虚函数表指针。
当类中有虚函数时,编译器也会在程序的静态区的rodata段的只读数据段,开辟一块空间,这块空间,即是虚函数表的空间
虚函数表是用来保存本类中虚函数的地址的。虚函数表,只要类中有虚函数就会有一张虚表。

1.3多态的意义:

1、提高了代码的维护性(继承保证)
2、提高了代码的扩展性(由多态保证)
3、多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。

1.4多态的问题及解决方案:使用虚析构

在使用多态时,当使用父类指针引用指向子类实例或引用子类实例时,一定要把最远端(父类)中的析构函数设定为虚析构。
如果父类中的析构函数设定为虚析构,那么所有子类的析构函数的逻辑都将是父类虚析构的重写。
这样当通过释放父类的指针也可以调用到子类析构的执行。这样可以避免内存资源的泄漏问题。
多态的问题:子类析构无法得到执行的问题。
解决方案:虚析构(在基类中设析构函数为虚析构)
当使用多态时,一定要保证:最远端父类中的析构函数一定是虚析构。这样可以避免子类的析构无法得到执行的问题,从而避免内存的泄漏。

2、纯虚函数与抽象类

纯虚函数是一种特殊的虚函数,它没有函数体,在类中主做为一个接口使用,纯虚函数的函数逻辑在子类中重写。由子类继承后进行重写。纯虚函数主是用来做为顶层的类的设计而使用的。
包括有纯虚函数的类,也被称之抽象类,抽象类也称之为接口类。
有纯虚函数的抽象类是不可以定义对象,只能使用指针或引用,指向或引用子类重写纯虚函数的子类对象。
如果子类中没有重写纯虚函数,那么子类也将成为抽象类。(顶层设计类)
纯虚函数书写形式如下:

class 类名
{
    virtual + 返回值 + 函数名+ (形参列表) = 0;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值