软件工程面向对象编程第四次课面向对象的设计风格.ppt

软件工程面向对象编程第四次课面向对象的设计风格.ppt

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
面向对象的程序设计 第四讲 面向对象编程技术 华中科技大学CAD中心 吴义忠 wuyz@ 内容提要 1、面向对象编程风格 2、多态性 3、派生类设计 4、抽象基类 5、虚函数 基于对象与面向对象 基于对象:对象设计,建立类 面向对象:类系,建立对象之间的关系 4.1 面向对象的编程风格 三大特性:封装(encapsulate)、继承(inheritance、多态(polymorphism) 继承性:父类(基类)和子类(派生类)组成继承体系或类系 多态性(polymorphism) 4.2 面向对象的编程 ch5_main.cpp 图书馆基类的实现 全局打印函数 测试结果 设计Book对象 再测试:注意virtual 4.3 无继承多态性:函数指针 4.4 抽象基类:含有纯虚函数的基类 分析设计“纯虚函数” 基类的check_integrity() 非虚函数 4.5 派生类设计:必须为基类的纯虚函数提供确切的重申明 派生类才有的函数length()等 派生类共有的非虚函数check_integrity() 改进设计: 去除派生类的check_integrity()定义 4.6 测试继承体系 ch6_main.cpp 4.7 抽象基类设计原则 基类应该多么抽象?具体问题具体分析,尽量减轻派生类的重复。 1)将派生类共同的操作提取放到基类作成员函数; 2)将派生类的共同属性提取放到基类作成员数据; 4.8 类初始化、析构和复制 抽象基类不能定义对象,因此一般构造函数为protected,其成员初始化放在派生类构造函数中 拷贝构造和拷贝赋值函数除非特殊用途,可以不定义 4.9 派生类中定义虚函数注意:const-ness相同 类型匹配例外 虚函数静态决议规则 1)构造函数和析构函数中调用虚函数就是自身的,不是派生类的; 2)当使用是基类的对象,而不是指针或引用时,调用虚函数同样属于基类的 4.10 运行时刻的类型识别 类型识别方法1-what_am_i(); 方法2:String member 方法3:typeid运算 静态转换 动态转换 其他 基类一定要定义虚析构函数 非基类不要有虚析构函数 明智地使用私有继承 区分继承和模板 基类一定要定义虚析构函数 c++语言标准关于这个问题的阐述非常清楚:当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。这意味着编译器生成的代码将会做任何它喜欢的事。 enemytarget *targetptr = new enemytank; ... delete targetptr; //注意:坦克目标的数目并没有减少!! 实际运行时经常发生的是,派生类的析构函数永远不会被调用。在本例中,这意味着当targetptr 删除时,enemytank的数量值不会改变,那么,敌人坦克的数量就是错的,这对需要高度依赖精确信息的部队来说,会造成什么后果? 非基类不要有虚析构函数 // 一个表示2d点的类 class point { public: ? point(short int xcoord, short int ycoord); ? ~point(); private: ? short int x, y; }; 如果一个short int占16位,一个point对象将刚好适合放进一个32位的寄存器中。另外,一个point对象可以作为一个32位的数据传给用c或fortran等其他语言写的函数中。但如果point的析构函数为虚,情况就会改变。 虚函数带来的内存占用大、移植问题 实现虚函数需要对象附带一些额外信息,以使对象在运行时可以确定该调用哪个虚函数。对大多数编译器来说,这个额外信息的具体形式是一个称为vptr(虚函数表指针)的指针。vptr指向的是一个称为vtbl(虚函数表)的函数指针数组。每个有虚函数的类都附带有一个vtbl。当对一个对象的某个虚函数进行请求调用时,实际被调用的函数是根据指向vtbl的vptr在vtbl里找到相应的函数指针来确定的。 虚函数实现的细节不重要,重要的是,如果point类包含一个虚函数,它的对象的体积将不知不觉地翻番,从2个16位的short变成了2个16位的short加上一个32位的vptr!point对象再也不能放到一个32位寄存器中去了。而且,c++中的point对象看起来再也不具有和其他语言如c中声明的那样相同的结构了,因为这些语言里没有vptr。所以,用其他语言写的函数来传递point也不再可能了,除非专门去为它们设计vptr,而这本身是实现的细节,会导致代码无法移植。 明智地使用私有继承 class Person { ... }; class Student:?????????????????

文档评论(0)

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

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

1亿VIP精品文档

相关文档