C第章多态性精品PPT课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
cout<<“area of a:”<<a.area()<<endl;
cout<<“area of c:”<<c.area()<<endl;
Point *p=&c;
cout<<“area of c:”<<p->area()<<endl;
}
第05章 多态性
信工计算机教研室
覆盖技术
☺a.area()表达式明确告诉编译器,它调用的 是Point的成员函数area,输出0。
☺c.area()表达式明确表示调用的是Circle的 成员函数area,输出19.6349。
☺因为指针p的数据类型是Point,根据赋值 兼容性规则,p->area(),调用的是Point 的成员函数,输出0。
第05章 多态性
信工计算机教研室
4、访问被覆盖的方法
class CPoint {
int x,y; public:
double area() { return 0;} };
第05章 多态性
信工计算机教研室
覆盖技术
class Circle: public Point {
double radius; public:
Circle(double a,double b,double r) : Point(a, b) { radius=r; }
{ num=int(a+0.5); } void show() { cout<<num<<endl; } };
第05章 多态性
信工计算机教研室
成员函数重载
void main() {
Inter i(3); i.show(); i.SetNum(5); i.show(); i.SetNum(6.6); i.show(); }
运行结果 3 5 7
编译时确 定调用哪 个版本函
数
第05章 多态性
信工计算机教研室
3、覆盖技术
☺ 在派生类中定义与基类同名的成员函数后,会出 现覆盖现象;实现重新定义基类成员函数。
const double PI=3.14159; class Point {
double x,y; public:
Point(double i,double j) { x=i; y=j; }
double real,imag; public:
Complex() { real=0; imag=0; } Complex(double r,double i); Complex(const Complex& c); void print(); void copy(const Complex& c); };
运行结果 5,3,4 7,5,6 7,8
c.CPoint::Show(); }
限定调用基类 成员,不好!
第05章 多态性
信工计算机教研室
主要内容
6.1 多态的概念 6.2 覆盖与重载 6.3 运算符重载 6.4 虚函数
第05章 多态性
信工计算机教研室
1、引入简单的复数类
class Complex {
☺覆盖:派生类和基类存在名称相同的成员函 数,实现派生类方法覆盖(改造)基类方法的 功能。如果要访问基类被覆盖方法,需要使 用类名前缀。
第05章 多态性
信工计s Inter {
int num; public:
Inter(int a) { num=a; } void SetNum(int a) { num=a; } void SetNum(double a)
CPoint(){ x=0; y=0; } CPoint(int a,int b) { x=a; y=b; } void Set(int a, int b){x=a; y=b;} void Show()
{ cout<<x<<“,”<<y<<endl; } };
第05章 多态性
信工计算机教研室
访问被覆盖的方法
主要内容
6.1 多态的概念 6.2 覆盖与重载 6.3 运算符重载 6.4 虚函数
第05章 多态性
信工计算机教研室
什么是多态性?
☺多态指不同对象接收到相同的消息时,产生 不同的行为(调用不同的方法)
使用同一个函数名,调用不同内容的函数 实现“一个接口,多种方法”
第05章 多态性
信工计算机教研室
什么是多态性?
☺在C++中通过覆盖、运算符重载、虚函数 等技术,使得基类和派生类中可以出现同名 的成员函数。不同的成员函数被调用时表现 出不同的行为,表现出很强的灵活性。
成员函数覆盖与重载 运算符重载 虚函数
第05章 多态性
信工计算机教研室
静态多态性和动态多态性
☺ 静态多态性:编译时的多态性,成员函数重载、 覆盖、运算符重载都属于静态多态性。编译器根 据实参数据类型或对象的数据类型,在编译时就 确定调用哪个函数。
double area() { return PI*radius*radius; }
};
第05章 多态性
信工计算机教研室
覆盖技术
void main() {
Point a(1.5,6.7); Circle c(1.5,6.7,2.5);
运行结果 area of a:0 area of c:19.6349 area of c:0
void Show() { cout<<radius<<“,”; CPoint::Show();}
};
第05章 多态性
信工计算机教研室
访问被覆盖的方法
void main()
{ Circle c(3,4,5);
间接调用基 类成员函数
c.Show(); c.Set(5,6,7); c.Show(); c.CPoint::Set(7,8);
☺ 动态多态性:运行时多态性,通过虚函数来实现。 通过虚函数实现的动态多态性,在代码执行的过 程中决定调用哪个函数。
第05章 多态性
信工计算机教研室
主要内容
6.1 多态的概念 6.2 覆盖与重载 6.3 运算符重载 6.4 虚函数
第05章 多态性
信工计算机教研室
1、成员函数重载和覆盖
☺重载:同一个类中,存在名称相同但“签名 不同”的成员函数(函数参数类型或个数不 同),编译时根据实参类型确定调用的是哪 个版本的函数。
class Circle : public CPoint { int radius; public:
Circle(int a,int b,int r):CPoint(a,b) { radius=r; }
void Set(int a,int b,int r) { CPoint::Set(a,b); radius=r; }