Ch2C++的重要性质.pptVIP

  • 0
  • 0
  • 约4.38千字
  • 约 21页
  • 2016-11-27 发布于河南
  • 举报
Ch2C的重要性质

Ch2:C++的重要性质 内容提要 类及其成员-谈封装(encapsulation) 基类与派生类-谈继承(Inheritance) This指针 虚函数与多态(Polymorphism) 类与对象大解剖 Object slicing与虚函数 静态成员(变量与函数) C++程序的生与死:兼谈构造函数与释构函数 四种不同的对象生存方式 运行时类型识别(RTTI) 动态创建(Dynamic Creation) 异常处理(Exception Handling) Template 类及其成员-谈封装(encapsulation) 世界是一个由各式各样的物体(对象,即object)所组成。任何实际的物体你都可以说它是对象.为了描述对象,我们应该先把对象的属性描述出来.给”对象的属性”一个比较学术的名词,就是“类”(class) 对象的属性有两大成员,一是属性(property),一是方法(method).比较程序化的说法是成员变量(member variable)和成员函数(member function).一般而言,成员变量通常由成员函数处理. 成员变量可以只在类内部处理,也可以开放给外界处理.以数据封装的目的而言,自然是前者较为稳妥,但有时候也不得不开放.为此,C++提供了private,public和protected三种修饰词.一般而言,成员变量尽量private,成员函数尽量public 把数据声明为private,不允许外界随意存取,只能通过特定的接口来操作 ,这就是面向对象的封装性(encapsulation) Example 如果以Csquare代表”正方形”这种类,正方形有color(成员变量),正方形可以display(成员函数). 基类与派生类-谈继承(Inheritance) 几个事实和问题 所有类都由CShap派生下来,所以它们都自然而然地继承了CShape的成员,包括变量和函数。也就是说,所有的形状都“暗自”(无法从各派生类的声明中看出来)具备了m_color变量和setcolor函数。 两个矩形对象rect1和rect2各有自己的m_color,但关于setcolor 函数却是共享相同的CRect::setcolor(其实更应该是CShape::setcolor)。问题是:同一个函数如何处理不同的数据?为什么rect1.setcolor和rect2.setcolor明明都是调用CRect::setcolor(即CShape::setcolor),却能够有条不紊地分别处理rect1.m_color和rect2.m_color?(this指针) 既然所有类都有display操作,那么把它提升到老祖宗CShape去,然后再继承之,好吗?不好,因为display函数应该因不同的形状而操作不同。 如果display不能提升到基类去,我们就不能够以一个for循环或while循环干净漂亮地完成下列操作(此种操作模式在面向对象程序方法中重要无比)(虚函数与多态) this指针 CRect::setcolor如何处理不同对象中的m_color?答案是:成员函数有一个隐藏参数,名为this指针。当你调用: rect1.setcolor(2); rect2.setcolor(3); 编译器实际作出来的代码是: CRect::setcolor(2,(CRect *)rect1); CRect::setcolor(3 ,(CRect *)rect2); 不过,由于CRect本身没有声明setcolor,它是从CShape继承过来的,所以编译器实际产生的代码是: CShape::setcolor(2,(CRect *)rect1); CShape::setcolor(3 ,(CRect *)rect2); 多出来的参数,就是所谓的this指针。 虚函数与多态 我们希望能够准备一个display函数,给使用者调用,不管他根据我的这一大堆形状类派生其他什么奇形怪状的类,只要他想display,像下面这样做就行: 为了支持这种能力,C++提供了所谓的虚函数 虚函数与多态-引例 程序实作代码见P55 指针的类型转换(1) 假设我们有两个对象: Cwage aWager; Csales aSales(“李四”); 销售员是时新职员之一,因此这样做是合理的: aWage=aSales;//合理,销售员必定是时新职员 这样就不合理: aSales=aWager;//错误,时新职员未必是销售员 如果你一定要转换,则必须使用指针,并且明显地做类型转换(cast)操作: CWage* pWager; CSales* pSales; CSales aSales(“李四”); pWager=aSales;//把一个“基类指针”指向派生类之对象,合理且自

文档评论(0)

1亿VIP精品文档

相关文档