C++面向对象程序设计 教学课件 ppt 作者 李兰_第6章

上传人:w****i 文档编号:94518146 上传时间:2019-08-08 格式:PPT 页数:171 大小:591.50KB
返回 下载 相关 举报
C++面向对象程序设计 教学课件 ppt 作者 李兰_第6章_第1页
第1页 / 共171页
C++面向对象程序设计 教学课件 ppt 作者 李兰_第6章_第2页
第2页 / 共171页
C++面向对象程序设计 教学课件 ppt 作者 李兰_第6章_第3页
第3页 / 共171页
C++面向对象程序设计 教学课件 ppt 作者 李兰_第6章_第4页
第4页 / 共171页
C++面向对象程序设计 教学课件 ppt 作者 李兰_第6章_第5页
第5页 / 共171页
点击查看更多>>
资源描述

《C++面向对象程序设计 教学课件 ppt 作者 李兰_第6章》由会员分享,可在线阅读,更多相关《C++面向对象程序设计 教学课件 ppt 作者 李兰_第6章(171页珍藏版)》请在金锄头文库上搜索。

1、6.1 静态联编和动态联编 (Static Binding and Dynamic Binding) 6.2 虚函数(Vitual Functions) 6.3 纯虚函数和抽象类 (Pure Virtual Functions and Abstract Classes) 6.4 运算符重载(Operator Overloading) 6.5 实例分析(Case Study) 6.6 常见编程错误 (Common Programming Errors) 本章小结(Chapter Summary) 习题6(Exercises 6),6.1.1 静态联编(Static Binding) 联编是指一个

2、计算机程序自身彼此关联的过程。联编在编译和连接时进行,称为静态联编。,6.1 静态联编和动态联编 (Static Binding and Dynamic Binding),【例6-1】 分析程序输出结果,理解静态联编的含义。 程序如下: #include const double PI=3.14; using namespace std; class Figure /定义基类 public: Figure();,double area() const return 0.0; ; class Circle : public Figure /定义派生类,公有继承方式 public: Circle(

3、double myr)R=myr; double area() const return PI*R*R; protected: double R; ;,class Rectangle : public Figure /定义派生类,公有继承方式 public: Rectangle (double myl,double myw)L=myl;W=myw; double area() const return L*W; private: double L,W; ; int main() ,Figure fig; /基类Figure对象 double area; area=Fig.area(); cou

4、t“Area of figure is “areaendl; Circle c(3.0); /派生类Circle对象 area=c.area(); cout“Area of circle is “areaendl; Rectangle rec(4.0,5.0); /派生类Rectangle对象 area=rec.area();,cout“Area of rectangle is “areaendl; return 0; 程序运行结果为: Area of figure is 0 Area of circle is 28.26 Area of rectangle is 20,【例6-2】 静态联编

5、的问题。 程序如下: #include const double PI=3.14; using namespace std; class Figure /定义基类 public: Figure(); double area() const return 0.0; ;,class Circle : public Figure /定义派生类,公有继承方式 public: Circle(double myr)R=myr; double area() const return PI*R*R; protected: double R; ;,class Rectangle : public Figure

6、/定义派生类,公有继承方式 public: Rectangle (double myl,double myw)L=myl;W=myw; double area() const return L*W; private: double L,W; ;,void func(Figure ,Circle c(3.0); /Circle派生类对象 cout“Area of circle is “; func(c); Rectangle rec(4.0,5.0); /Rectangle派生类对象 cout“Area of rectangle is “; func(rec); return 0; ,程序运行结

7、果为: Area of figure is 0 Area of circle is 0 Area of rectangle is 0,6.1.2 动态联编(Dynamic Binding) 联编在程序运行时进行,称为动态联编,或称动态绑定,又叫晚期联编。在编译、链接过程中无法解决的联编问题,要等到程序开始运行之后再来确定。动态联编的主要优点是提供了更好的编程灵活性、问题抽象性和程序易维护性,但是与静态联编相比,函数调用速度慢,因为动态联编需要在程序运行过程中搜索以确定函数调用(消息)与程序代码(方法)之间的匹配关系。,6.2.1 虚函数的定义和使用 (Definition and Usage

8、of Virtual Functions) 1定义虚函数 声明虚函数的一般格式为: class public:,6.2 虚 函 数 (Vitual Functions),virtual (); /虚函数的声明 ; :() /虚函数的定义 ,2使用虚函数 当在类的层次结构中声明了虚函数以后,并不一定就能实现运行时的多态性,必须合理调用虚函数才能实现动态联编。只有在程序中使用基类类型的指针或引用调用虚函数时,系统才以动态联编方式实现对虚函数的调用。如果使用对象名调用虚函数,系统仍然以静态联编方式完成对虚函数的调用,也就是说,用哪个类说明的对象,就调用在哪个类中定义的虚函数。,【例6-3】 理解运行

9、时的多态性。 程序如下: #include const double PI=3.14; using namespace std; class A /定义基类 public: A();,virtual double area() const return 0.0; /定义为虚函数 ; class B : public A /定义派生类,公有继承方式 public: B(double myr)R=myr; virtual double area() const return PI*R*R; /定义为虚函数 protected: double R; ; class C : public A /定义派

10、生类,公有继承方式 ,public: C (double myl,double myw)L=myl;W=myw; virtual double area() const return L*W; /定义为虚函数 private: double L,W; ; void func(A ,double main() A fig; /基类A对象 cout“Area of A is “; func(fig); B c(3.0); / B派生类对象 cout“Area of B is “; func(c);,C rec(4.0,5.0); / C派生类对象 cout“Area of C is “; func

11、(rec); return 0; 程序运行结果为: Area of A is 0 Area of B is 28.26 Area of C is 20,3虚函数与函数重载的关系 在派生类中重新定义基类中的虚函数,是函数重载的另一种形式。但虚函数与一般重载函数有区别,具体区别在于: (1) 重载函数的调用是以所传递参数序列的差别作为调用不同函数的依据;而虚函数是根据对象的不同去调用不同类的虚函数。,(2) 重载函数在编译时表现出多态性,是静态联编;虚函数则在运行时表现出多态性,是动态联编。 (3) 构造函数可以重载,析构函数不能重载;正好相反,构造函数不能定义为虚函数,析构函数能定义为虚函数。

12、(4) 重载函数只要求函数有相同的函数名,并且重载函数是在相同作用域中定义的名字相同的不同函数;而虚函数不仅要求函数名相同,而且要求函数的签名、返回类型也相同。 (5) 重载函数可以是成员函数或友元函数;而虚函数只能是非静态成员函数。,6.2.2 虚函数的特性(Virtual Functions Feature) 由虚函数实现的动态多态性就是:同一类中不同的对象对同一函数调用作出不同的响应。在派生类中重新定义函数时,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。,【例6-4】 虚函数的特性。 程序如下: /继承虚属性 #include usi

13、ng namespace std; class Base public: virtual int func(int x) /虚函数 ,cout “This is Base class “; return x; ; class Subclass :public Base public: int func(int x) /实为虚函数 ,cout “This is Sub class “; return x; ; void test (Base,Subclass sc; test (bc); test (sc); 程序运行结果为: This is Base class x=5 This is Sub

14、 class x=5,【例6-5】 演示虚函数使用不恰当。 程序如下: #include using namespace std; class Base public: virtual int func(int x) /虚函数返回类型为int cout “This is Base class “;,return x; ; class Subclass :public Base public: virtual float func(int x) /虚函数返回类型为float ,cout “This is Sub class “; float y=float(x); return y; ; void test(Base, void main() Base bc; Subclass sc; test (bc); test (sc); ,【例6-6】 演示虚函数特性失效程序。 程序如下: #include using namespace std; class Base public:,virtual int func(int x) /虚函数,形参为int型 cout “This is Base class “;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号