高程 | 多态性(c++)
文章目录
- 📚多态
- 📚运算符重载
- 🐇定义
- 🐇规则
- 🐇友元运算符重载函数
- 🐇成员运算符重载函数
- 📚虚函数
- 📚纯虚函数和抽象类
📚多态
- 多态:同样的消息被不同类型的对象接收时导致不同的行为。
- 类型:
- ⭐️重载多态:普通函数及类的成员函数的重载。
- ⭐️强制多态:将一个变元的类型加以变化,以符合一个函数或者操作的要求。
- ⭐️包含多态:类族中定义于不同类中的同名成员函数的多态行为,主要是通过虚函数实现。
- ⭐️参数多态:与类模板相关联。
- 多态的实现:编译时的多态性和运行时的多态性。
- 前者为函数重载和模板,事先设定好。
- 后者动态联编程序运行时才能确认是用哪个函数。
📚运算符重载
- 运算符重载详解博客
🐇定义
- 运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同的行为。
- 实质就是函数重载。
operator
是重载关键字。
🐇规则
- C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符。不能重载的运算符:
- 成员访问运算符
.
- 成员指针访问运算符
.*
- 作用域运算符
::
- 长度运算符
Sizeof
- 条件运算符
?:
- 成员访问运算符
- 重载后运算符的优先级和结合性都不会改变。
- 一般重载运算符后的意思与本意大致相同。
- 重载不能改变操作数的个数。
- 运算符重载函数的参数必须有一个是非c++标准类型,即至少有一个操作类型是自定义类型。
- 类对象的运算符除
=
外都需要重载。
🐇友元运算符重载函数
-
友元运算符重载函数是一种特殊的成员函数,它允许我们为一个类定义自定义的友元运算符操作。
-
友元运算符重载函数的语法如下:
friend 函数类型 operator 重载运算符 (形参表) {函数体; }
-
友元运算符重载函数必须声明为类的友元函数。这样,它才能够访问类的私有成员。
-
友元运算符重载函数没有隐式的
this
指针,因此不能直接访问类的成员变量和成员函数。但可以通过参数列表中的参数来访问类的对象。 -
友元运算符重载函数通常定义在类的内部,但是使用
friend
关键字将其声明为友元函数。 -
友元运算符重载函数可以实现任何自定义的运算符操作,例如加法、减法、乘法、除法等。
🐇成员运算符重载函数
- 语法
函数类型 operator 重载运算符(形参表) {函数体; }
- 函数类型为此运算符的返回类型,可以不是类类型。
+=
,-=
等建议成员函数,其他建议友元。
📚虚函数
- 类内声明函数类型前加virtual,定义时不用加。
- 派生类中的虚函数的重新定义必须和基类中的一模一样,(函数与耐性,函数名,参数个数,参数类型顺序),否则会丢失虚特性。
- 派生类中函数与基类中的虚函数一旦同名,则自动成为虚函数,所以关键字virtual可不加。
- 派生类未对基类虚函数重新定义,则原样继承基类的虚函数,无论继承多少次,仍保持虚函数特性。
- 虚函数不能是友元函数,不能是静态成员函数,因为虚函数需要特定的对象来激活。
📚纯虚函数和抽象类
virtual 函数类型 函数名(参数表)=0;
- 即基类中不再给出实现部分只保留名字,因此不具备函数功能,不能被调用。
- 有一个纯虚函数的类就叫做抽象类
- 抽象类的主要作用是通过它为一个类族建立一个公共的接口,使它们能够更有效地发挥多态特性。
- 抽象类声明了一组派生类共同操作接口的通用语义,而接口的完整实现,即纯虚函数的函数体,要由派生类自己给出。
- 只能做基类,不能声明基类对象。
- 不能做参数类型,函数返回类型或显式转换类型,但可以声明基类型指针变量,由此可以指向派生类,实现动态联编。
- 如果派生类中没有重新定义纯虚函数,那么派生类还是一个抽象类。
- 在类成员方法的声明(不是定义)语句前面加个单词
virtual
,它就会摇身一变成为虚函数。 - 在虚函数的声明语句未尾中加个
=0
,它就会摇身一变成为纯虚函数。 - 子类可以重新定义基类的虚函数,我们把这个行为称之为复写(override)。
- 不管是虚函数还是纯虚函数,基类均可为其提供实现代码(implementation),在这种情况下子类可以调用基类的这些实现。
- 子类自主选择是否要提供一份属于自己的个性化虚函数实现。
- 子类必须提供一份属于自己的个性化纯虚函数实现。
👀在C++中,能否声明虚构造函数?为什么?能否声明虚析构函数?有何用途?
- 在C++中,不能声明虚构造函数,多态是不同的对象对同一消息有不同的行为特性,虚函数作为运行过程中多态的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有意义的;
- 可以声明虚析构函数,析构函数的功能是在该类对象消亡之前进行一些必要的清理工作,如果一个类的析构函数是虚函数,那么,由它派生而来的所有子类的析构函数也是虚函数。析构函数设置为虚函数之后,在使用指针引用时可以动态联编,实现运行时的多态,保证使用基类的指针就能够调用适当的析构函数针对不同的对象进行清理工作。
👀群体类和群体数据的组织(主要是template模板)相关博客补充
- 清华大学C++课程学习笔记
- C++中的函数模板
- C++中的类模板