【C++】 类和对象期末复习笔记(四)——多态性

引言

前面两篇基础篇和一篇继承篇已经完工,地址如下👇
基础篇:
笔记一
笔记二
继承和派生篇:
笔记三

正文

1、多态:分为静态多态动态多态
1)静态多态:函数重载、运算符重载、模板。
2)动态多态:也称运行时多态,在程序运行阶段才能确定关系。
C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

2、函数重载
1)函数重载:赋予一个函数名多个含义

2)一般而言,重载函数是功能相似的一组函数,它们提供了使用相同功能的不同形态。

3、运算符重载
1)运算符重载通过定义运算符重载函数实现。

2)C++中大部分运算符都能被重载,少部分不行,有如下几个:

条件运算符:?:
成员访问运算符:.
成员指针访问运算符:.*
作用域运算符:::
求字节数运算符:sizeof

3)重载运算符的限制:

a.只能对C++自身提供的运算符重载,不可臆造新的运算符
b.重载运算符时,不允许改变运算符的语法结构
c.重载运算符时,不允许改变运算符的优先级和结合性

4)重载运算符的方式:
a.成员函数实现
b.非成员函数实现:普通函数&友元函数

5)重载为成员函数的写法:

Complex operator+(int a)  //在类内定义
{
	......
}

Complex Complex::operator+(int a)   //在类外定义
{
	......
}    

6)成员函数重载运算符时,对二元运算符,运算符重载函数有两个参数;对一元运算符运算符重载函数无参数。

7)由于友元函数是非成员函数,一般不在类内定义友元函数,在类内只对友元函数做声明
重载为友元函数的写法:

friend Complex operator+(int a, int b)  //在类内定义
{
	......
}

Complex operator+(int a, int b)   //在类外定义
{
	......
}   

8)友元函数重载运算符时,对二元运算符,友元运算符重载函数有两个参数;对一元运算符,友元运算符重载函数只有一个参数。

9)友元函数不是类的成员函数(即非成员函数),在类外定义时不需要类名限定

4、重载运算符为成员函数和友元函数的区别:
假设有这样一个表达式:c+5.6
1)若重载为成员函数,编译器将其处理为c.operator+(5.6)
2)若重载为友元函数,编译器将其处理为operator+(c,5.6)
两种方式都是可以的,运行结果一样。

5、对一般的二元运算符重载为友元函数比重载为成员函数更优越,但是对于赋值运算符,将其重载为成员函数更好,实际上赋值运算符只能重载为成员函数

6、若类中有指针指向动态分配的存储空间,编程者就必须定义赋值运算符重载函数。

7、关于赋值运算符重载函数的说明:
1)只能使用成员函数实现。
2)不能被派生类继承。
3)不能定义为虚函数。
4)若编程者未显式定义赋值运算符重载函数,C++会自动生成;但对于复合赋值运算符,如+=、*=等,C++不会自动生成对应的重载函数,必须由编程者自行定义。

8、类型转换函数
1)假设有“Complex a(3,2); double x=6.2;",进行赋值运算a=x和x=a,C++会处理成a=Complex(x)和x=double(a),第一种C++调用构造函数完成转换,第二种就得定义一个类型转换函数实现转换。

2)类型转换函数写法:

operator double()     //类内定义 
{
	......
}

Complex operator double()     //类外定义 
{
	......
}

9、运算符重载函数的形参不允许有默认值。

10、C++中唯一不能被派生类继承的是赋值运算符重载函数,其他的运算符重载函数都能被派生类继承。

11、静态联编&动态联编
1)联编:计算机程序彼此关联的过程,在多态类中指函数间调用关系的确定。分为静态联编和动态联编。(此文侧重讲动态联编)

2)动态联编技术实现动态多态,C++中提供的动态联编技术是通过虚函数实现的。

3)只有类的成员函数才能定义为虚函数。

4)虚函数写法:(函数前头加关键字virtual)

virtual double A
{
	......
}

virtual int B
{
	...... 
} 

5)当基类中有虚函数,派生类想定义同名虚函数时,则派生类中的虚函数必须与基类中的虚函数同名,且函数的参数个数、参数类型必须完全一致,否则属于函数的重载,不是虚函数。

6)续第5点,基类中虚函数的关键字virtual不能缺省,派生类中同名虚函数的virtual可以缺省,缺省后仍是虚函数。

7)动态多态必须通过基类对象的引用或基类对象的指针调用虚函数才能实现。

8)友元函数不能定义为虚函数,因为友元函数不是类的成员函数。

9)静态成员函数不能定义为虚函数,因为静态成员函数属于类,与具体某个对象无关。

10)内联函数不能定义为虚函数。

11)不能将构造函数定义为虚函数,但可将析构函数定义为虚函数。

12)每个包含了虚函数的类都包含一个虚表,用于存放虚函数的地址(若基类有,则派生类也有)。

13)构造函数调用虚函数,调用的是类本身的虚函数。

14)成员函数调用虚函数,遵循动态多态性原则。

12、纯虚函数
1)定义:基类中没有给出具体实现的函数。

2)纯虚函数写法:

virtual int Area()=0;

PS:上述纯虚函数的定义中没有函数体,用“=0”代替。若想将纯虚函数定义为空函数,应该是这样的:

virtual int Area() {}

3)含有纯虚函数的类称为抽象类。

4)抽象类不能定义(生成)对象,只能派生。若它派生的类的纯虚函数没有被改写,那么它的派生类还是个抽象类。

5)使用抽象类和纯虚函数的目的是编写通用函数,增加编程的灵活性。

6)抽象类只能做派生类的基类,不能定义抽象类的对象。

7)若派生类实现了基类所有的纯虚函数,则派生类就不再是抽象类了;若派生类没有实现基类所有的纯虚函数,则派生类依然是抽象类。

8)一般情况下,纯虚函数没有函数体。

9)纯虚函数最显著的特征是:它们必须在继承类中重新声明函数(不要后面的=0,否则该派生类也不能实例化),而且它们在抽象类中往往没有定义。

10)定义纯虚函数的目的:使派生类仅仅只是继承函数的接口。

13、相关题目

题目一:定义矩阵类Matrix
题目二:定义几何图形抽象类Shape

以上是两道比较精华的多态的题,自己打打可以加强对多态的理解~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值