☰
C++继承和多态
2026/10/4 1:43:53 网站建设 项目流程

1 继承

1.1概念

代码复用的办法,在原类的基础上拓展

1.2继承方式

pibulic继承:成员访问限定符不变

protected继承:共有变保护

private继承:全变私有

1.3 父子类对象赋值

向上转换:子类的对象/指针/引用可以直接赋值给父类的对象,指针,引用(切割)

向下转换:父类的对象不可以赋值给子类的对象,但父类的指针/引用可以赋值给子类的指针,引用(强制类型转换)

1.4子类的默认成员函数

1.4.1构造函数

初始化列表不能初始化父类成员,必须调用父类构造函数

1.4.2拷贝构造

必须调用父类拷贝构造初始化父类的拷贝

1.4.3赋值重载

同样必须调用父类赋值重载

1.4.4析构

会在调用完成后再自动调用父类析构,保证先子后父的析构顺序

为了实现多态的重写析构函数被统一被改名为destrutor

1.5多继承与菱形继承

1.5.1多继承指一个子类有多个父类

1.5.2菱形继承

指子类的多个父类含有同一个基类造成数据冗余,二义性等问题

1.6虚拟继承

1.6.1虚继承

虚继承用于解决菱形继承的二义性和数据冗余问题

通过建立虚基表)实现

1.6.3虚基表

虚基表:将冲突的数据放在最后每个父类带一个地址(指向虚基表)虚基表中存放该父类指针到所需的数据的偏移量

2 多态

2.1概念

静态多态:函数重载

动态多态:继承中实现多态,子类继承父类时对父类的虚函数进行重写并满足下面两个条件。

两个条件:

1,必须通过父类的指针或引用调用虚函数。(直接使用对象会直接使用对象的静态类型。而使用父类对象的指针引用,编译器不知道实际对象类型(子类或父类都有可能))

2,必须对虚函数进行重写

举例,父类:成人 ,子类:学生

成票全价,学生票半价

实现不同的对象调用不同的函数

2.2虚函数

被virtual修饰的函数

父类加virtual子类不加virtual也可以构成重写但是不规范。

2.3虚函数的重写,协变

用于实现不同的对象调用不同的函数

子类中有一个与父类返回值参数函数名相同的函数(父类的该函数需要是虚函数,否则被隐藏)

备注:重写不会影响缺省参数,析构函数是虚函数时,子类不加virtual也构成重写

协变:重写时返回值可以不同但必须是父子类关系的引用和指针

2.4虚表(虚函数表)

一个含有虚函数的类至少含有一个指针指向虚函数表

如图_Vfptr指向的就是虚表

2.5抽象类

纯虚函数:在虚函数后加=0

包含纯虚函数的类被称为抽象类(接口类)

抽象类不能实例化对象,只有被继承重写后才能实例化,规定了这个类必须被重写。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询