主要内容:
1.多态性
2.运算符重载
3.虚函数
4.纯虚函数
5.抽象类
多态实现:
--函数重载
--运算符重载
--虚函数
限制:有些运算符是不可重载的,重载基本是改变操作对象,有基本类型转为user-defined类型。
实现机制:运算表达式==》运算符函数,运算对象==》运算符函数的实参
形式:1.重载为类成员函数,此时 参数个数=原操作数-1(后置++,--除外)
2.重载为友元函数,此时 参数个数 = 原操作数个数,至少有一个用户自定义类型的形参。
声明形式:
函数类型 operator 运算符(形参)
{
.....
}
运算符成员函数的设计:
1.双目运算符B
oprd1 B oprd2
若oprd1 是A类对象 则 oprd1 B oprd2 ==>> oprd1.operator B(oprd2)
2.前置单目运算符U
U oprd
若oprd 为A类对象 ,U 被重载为A类的成员函数 则U oprd ==>> oprd.operator U()
3.后置单目运算符++、--
oprd++ / oprd--
若oprd为A类对象,++、--被重载为A类的成员函数,且具有一个int类型形参。则 oprd++ ==> oprd.operator++(0)
为何要这样设计呢???如果不明白,虽然现在看懂了,过后还是忘得?????
运算符友元函数设计:
1.双目运算符B
oprd1 B oprd2 ===> operator B(oprd1,oprd2)
2.前置单目运算符B
B oprd ===>operator B(oprd)
3.后置单目运算符++、--
oprd B ===>operator B(oprd,0)
静态绑定与动态绑定
1.绑定: 程序自身彼此关联的过程,确定程序中的操作调用与执行该操作的代码间的关系。
2.静态绑定(静态联编)
编译阶段,用对象名或者类名来限定要调用的函数
3.动态绑定
运行阶段,程序运行时确定将要调用的函数
还是不太明白静态编译和动态编译的概念,到底是如何实现动态的编译呢?????
虚函数:
本质:不是重载声明而是覆盖
调用方式:根据指针指向的对象的类,而不是指针本身的类型。
虚析构函数:
虚技术与析构函数的合体,这样可以用基类指针delete派生类得对象。
抽象类
只要含有纯虚函数的类就是抽象类
class 类名
{
virtual 类型 函数名(参数表)=0;/纯虚函数
}
NOTE:
抽象类只能作为基类来使用
不能声明抽象类的对象
构造函数能是虚函数,析构函数可以是虚函数(????)
还有一个疑问:为何构造函数不具有继承特性呢。析构函数呢?析构函数也不具有继承特性。但可以有虚析构函数