4 多态性和虚函数.PPT

  1. 1、本文档共57页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3.4.1 用基类指针指向派生类对象 声明一个派生类的对象的同时也自动声明了一个基类的对象。 —— 3.3小节内容 派生类的对象可以认为是其基类的对象。C++允许一个基类对象的指针指向其派生类的对象 —— 这是实现虚函数的关键 不允许派生类对象的指针指向其基类的对象。 即使将一个基类对象的指针指向其派生类的对象,通过该指针也只能访问派生类中从基类继承的公有成员,不能访问派生类自定义的成员,除非通过强制类型转换将基类指针转换为派生类指针。 例 基类指针与派生类指针之间的相互转换。 3.4.2 虚函数 2. 虚函数的声明 要将一个成员函数声明为虚函数,只需在定义基类时在成员函数声明的开始位置加上关键字virtual。 void main() { A a, *pa; B b; pa=a; pa-Show(); // 调用函数A::Show() pa=b; pa-Show(); // 调用函数B::Show() } 3. 联编的概念 即将函数调用语句与函数代码相关联。 两种联编方式:静态联编和动态联编。静态联编是指编译器在编译阶段就确定了要调用的函数,即早期绑定。动态联编是指在程序执行过程中根据具体情况再确定要调用的函数,即后期绑定。 重载采用静态联编方式:虽然函数名相同,但编译器能够根据函数参数类型的不同确定要调用的函数。重载体现出一种静态多态性或编译时多态性。 当通过基类指针调用虚函数时,C++采用动态联编方式。虚函数体现出一种动态多态性或运行时多态性。 4. 构造函数、析构函数与虚函数 基于构造函数的特点,不能将构造函数定义为虚函数。 例 虚析构函数的使用。 class A { public: A() { }; // 构造函数不能是虚函数 virtual ~A() { coutA::destructor\n; }; // 析构函数是虚函数 }; class B : public A { public: B() { }; ~B() { coutB::destructor\n; }; // 虚析构函数 }; void main() { A *pA=new B; // . . . . . . delete pA; // 先调用派生类B的构造函数,再调用基类A的构造函数 } 3.4.3 抽象类和纯虚函数 抽象类是类的一些行为(成员函数)没有给出具体定义的类,即纯粹的一种抽象。 抽象类只能用于类的继承,其本身不能用来创建对象,抽象类又称为抽象基类。 抽象基类只提供了一个框架,仅仅起着一个统一接口的作用,而很多具体的功能由派生出来的类去实现。 虽然不能声明抽象类的对象,但可以声明指向抽象类的指针。 不定义具体实现的成员函数称为纯虚函数。纯虚函数不能被调用,仅起提供一个统一接口的作用。 纯虚函数的声明: virtual 数据类型 成员函数名(形参表)= 0 ; 当基类是抽象类时,只有在派生类中重新定义基类中的所有纯虚函数,该派生类才不会再成为抽象类。 // 定义抽象基类 class CShape { public: double r ; double s ; public: CShape(double x) { r=x; } // 声明纯虚函数 virtual void Area()=0; }; 3.5 重载 3.5.1 函数重载 函数重载:指一组功能类似但函数参数类型(个数)不同的函数可以共用一个函数名。 当C++编译器遇到重载函数的调用语句时,它能够根据不同的参数类型或不同的参数个数选择一个合适的函数。 main() { int i=100; coutabs(i)endl; // int型 float f=-125.78F; coutabs(f)endl; // float型 } 例 构造函数的重载。 void main() { Box box1; Box box2(10, 15, 20); coutVolume1=box1.Volume() , Volume2=box2.Volume()endl; } 3.5.2 运算符重载 运算符重载:指对于不同数据类型的操作数,同一个运算符所代表的运算功能可以不同。 一个运算符定义了一种操作,一个函数也定义了一种操作,其本质是相同的,当程序遇到运算符时会自动调用相应的运算符函数。 虽然重载运算符完成的功能都能够用

文档评论(0)

497721292 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档