6.1多态性的概念6.2一个典型的例子6.3虚函数6.4纯虚函数与抽象类.pptVIP

6.1多态性的概念6.2一个典型的例子6.3虚函数6.4纯虚函数与抽象类.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
6.1多态性的概念6.2一个典型的例子6.3虚函数6.4纯虚函数与抽象类.ppt

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 需要说明的是: 使用虚函数,系统要有一定的空间开销。当一 个类带有虚函数时,编译系统会为该类构造一个虚函数表(virtual function table,简称vtable),它是一个指针数组,存放每个虚函 数的入口地址。系统在进行动态关联时的时间开销是很少的,因此, 多态性是高效的。 析构函数的作用是在对象撤销之前做必要的“清理现场”的工 作。当派生类的对象从内存中撤销时一般先调用派生类的析构函数, 然后再调用基类的析构函数。但是,如果用new运算符建立了临时 对象,若基类中有析构函数,并且定义了一个指向该基类的指针变 量。在程序用带指针参数的delete运算符撤销对象时,会发生一个 情况: 系统会只执行基类的析构函数,而不执行派生类的析构函数。 例6.3 基类中有非虚析构函数时的执行情况。 为简化程序,只列出最必要的部分。 #include iostream using namespace std; class Point//定义基类Point类 {public: Point( ){ } //Point类构造函数 ~Point(){cout″executing Point destructor″endl;}//Point类析构函数 }; class Circle:public Point //定义派生类Circle类 {public: Circle( ){ } //Circle类构造函数 ~Circle( ){cout″executing Circle destructor″endl;}//Circle类析构函数 private: int radius; }; int main( ) { Point *p=new Circle; //用new开辟动态存储空间 delete p; //用delete释放动态存储空间 return 0; } 这只是一个示意的程序。p是指向基类的指针变量,指向new 开辟的动态存储空间,希望用detele释放p所指向的空间。但运行 结果为 executing Point destructor 表示只执行了基类Point的析构函数,而没有执行派生类Circle 的析构函数。原因是以前介绍过的。如果希望能执行派生类Circle的 析构函数,可以将基类的析构函数声明为虚析构函数,如 virtual ~Point(){cout″executing Point destructor″endl;} 程序其他部分不改动,再运行程序,结果为 executing Circle destructor executing Point destructor 先调用了派生类的析构函数,再调用了基类的析构函数,符合 人们的愿望。当基类的析构函数为虚函数时,无论指针指的是同一 类族中的哪一个类对象,系统会采用动态关联,调用相应的析构函 数,对该对象进行清理工作。 如果将基类的析构函数声明为虚函数时,由该基类所派生的所 有派生类的析构函数也都自动成为虚函数,即使派生类的析构函数 与基类的析构函数名字不相同。 最好把基类的析构函数声明为虚函数。这将使所有派生类的析 构函数自动成为虚函数。这样,如果程序中显式地用了delete运算 符准备删除一个对象,而delete运算符的操作对象用了指向派生类 对象的基类指针,则系统会调用相应类的析构函数。 虚析构函数的概念和用法很简单,但它在面向对象程序设计中 却是很重要的技巧。专业人员一般都习惯声明虚析构函数,即使基 类并不需要析构函数,也显式地定义一个函数体为空的虚析构函数, 以保证在撤销动态分配空间时能得到正确的处理。 构造函数不能声明为虚函数。这是因为在执行构造函数时类对 象还未完成建立过程,当然谈不上函数与类对象的绑定。 有时在基类中将某一成员函数定为虚函数,并不是基类本身的 要求,而是考虑到派生类的需要,在基类中预留了一个函数名,具 体功能留给派生类根据需要去定义。例如在本章的例6.1程序

文档评论(0)

zcbsj + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档