【C++】多态(一):重载多态笔记
多态和动态绑定->(支持)->将派生类对象当成基类对象使用
1. 多态概述
多态:同样的消息被不同的类型的对象接受时导致不同的行为
消息 :对类的成员函数的调用。
不同的行为:不同的实现,调用了不同函数
2. 多态类型(4种)
- 重载多态:普通函数、类中成员函数
- 强制多态:类型变化
- 包含多态:定义【类族】中不同类的同名成员函数(虚函数实现)
- 参数多态:与类模板相关联,由类模板实例化的各个类具有相同的操作,而操作对象类型不同
3. 多态实现
- 编译时多态:编译中确定同名操作的具体操作对象(绑定)——静态绑定(确定工作在编译连接阶段)
- 运行时多态:程序运行中动态确定同名操作的具体操作对象——动态绑定(确定工作在程序运行阶段)
绑定:计算机程序自身彼此关联(一个标识符 和 一个存储地址 联系/一条消息 和 一个对象 相结合)
运行时多态
4. 运算符重载
定义:对已有的运算符赋予多重定义,使得同一个运算符作用域不同类型的数据时导致不同的行为
实质:函数重载
实现:(编译中完成)
step1: 指定的运算表达式——>对运算符函数的调用,
step2: 运算对象——>运算符函数的实参
step3: 根据实参类型——>确定需要调用的函数
规则:
- 类属运算符‘.’ 成员指针运算符’.’ 作用域分辨符 ‘::*’ 三目运算符 ‘: ?’ (不可重载)
- 重载后,优先级和结合性不能改变
- 重载功能与原有功能相似,不能改变元运算符的操作个数,至少要有一个操作对象是自定义类型
重载形式(2):
- 重载为类的非静态成员函数
返回类型 operator 运算符(形参表){ 函数体 } - 重载为非成员函数
返回类型 operator 运算符(形参表){ 函数体 }
示例:
#include<iostream>
using std::istream;
using std::ostream;
class CA
{
int a;
public:
CA(){};//无参构造
CA(int a){this->a = a;}//带参构造
public:
CA operator+(CA const& srcCA) const;//operator+ 来表示函数名
//参数列表,因为通过对象的成员函数来实现运算符重载,所以this算一个参数,也只能是第一个参数
CA operator-(CA const& srcCA) const;
CA& operator++();//++前置
CA operator++(int);//++后置,int表示修饰
/**第一个参数是输入输出流,不是this类型,类型不匹配,重载不能写进类内*/
friend CA operator*(CA const& srcCA,CA const& srcCB);//不属于该类,可以传入两个参数,没有this指针
friend ostream& operator<<(ostream& os,CA const& srcCA);//输出重载
friend istream& operator>>(isstream& os, CA &srcCA);//无const,修改CA
}
运算符+重载
CA CA::operator+(CA const& srcCA) const//返回类对象
{
CA z;
z.a = this->a +srcCA.a;
return z;
}
运算符-重载
CA CA::operator-(CA const& srcCA) const//返回类对象
{
CA z;
z.a = this->a -srcCA.a;
return z;
}
运算符++前置 重载
CA& CA::operator+()//++前置
{
a++;
return *this
}
运算符* 重载(友元)
CA operator*(CA const& srcCA,CA const& srcCB)
{
CA z;
z.a = srcCA.a * srcCB.a;
return z;
}
运算符++后置 重载
CA CA::operator++(int)//++后置
{
CA z = *this;//先备份
a ++;
return z;
}
输出流 重载
ostream& operator<<(ostream& os, CA const& scrCA)
{
os<<srcCA.a;
return os;
}
输入流 重载
istream& operator>>(istream& is,CA& srcCA)
{
is>>srcCA.a;
return is;
}
调用:
int main{
CA x(1);
CA y(1);
CA m = x+y;//拷贝构造的隐式调用 x+y CA对象的+运算符的符号调用
CA n(x.operator+(y));//拷贝构造的显示调用 x.operator+(y):CA对象的+运算符的函数调用
CA K = x*y;//友元描述,可用符号调用,不可按成员函数调用
++m;
}
5.小结
- 运算符实际上是函数的一种简化形式,在类中和结构中
- 理解类中成员函数,this作为隐含参数 对照 友元定义