友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

深入浅出MFC第2版(PDF格式)-第27章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



…………………………………………………………Page 121……………………………………………………………

     square。display (); // 调用CSquare::display 



     rect1。setcolor (2); // 于是rect1。m_color = 2 



     rect1。display (); // 调用CRect::display 



     rect2。setcolor (3); // 于是rect2。m_color = 3 



     rect2。display (); // 调用CRect::display 



     circle。setcolor (4); // 于是circle。m_color = 4 



     circle。display (); // 调用CCircle::display 



 注意以下这些事实与问题: 



 1。 所有类别都由CShape 衍生下来,所以它们都自然而然继承了CShape  的成员, 



   包括变量和函数。也就是说,所有的形状类别都「暗自」具备了m_color 变量 



   和setcolor  函数。我所谓暗自(implicit ),意思是无法从各衍生类别的声明中 



   直接看出来。 



 2。 两个矩形对象rect1 和rect2 各有自己的m_color,但关于setcolor  函数却是 



            CRect::setcolor             CShape::setcolor 

   共享相同的                 (其实更应该说是                    )。我用这张图表 



   示其间的关系: 



                                       这个this 参数是编译器自行为我们加上的, 

                                                   “       ” 

        对象rect1         对象rect2        所以我说它是个 隐藏指针 。 



                                        CRect::setcolor(int color; 

       m_color         m_color 

                                                       CRect* this) 

                                        { 

                                         this…》m_color = color; 

                                        } 



         this 指针       this 指针 



     rect1。setcolor   rect2。setcolor            CRect::setcolor 

                     和                 调用的都是                    , 

     后者之所以能分别处理不同对象的成员变量,完全是靠一个隐藏的this 指针。 



                                                     rect1 setcolor  

让我替你问一个问题:同一个函数如何处理不同的资料?为什么                             。      和 



rect2 setcolor        CRect setcolor         CShape  setcolor 

    。      明明都是调用          ::      (其实也就是          ::      ),却能够 



                 rect1 m_color  rect2。m_color           this  

有条不紊地分别处理            。      和            ?答案在于所谓的          指针。下 



一节我就会提到它。 



                                                                                   59 


…………………………………………………………Page 122……………………………………………………………

3。  既然所有类别都有displ ay 动作,把它提升到老祖宗CShape 去,然后再继承 



  之,好吗?不好,因为displ ay  函数应该因不同的形状而动作不同。 



     displ ay                               f or    while 

4。 如果      不能提升到基础类别去,我们就不能够以一个                循环或 



  循环干净漂亮地完成下列动作(此种动作模式在对象导向程序方法中重要无 



  比): 



     CShape shapes'5'; 



      。。。 //   5   shapes  

            令  个       各为矩形、四方形、椭圆形、圆形、三角形 



     for  (int i=0; im_color = color; } 



          }; 



    我们拨开了第一道疑云。 



                                                                                      61 


…………………………………………………………Page 124……………………………………………………………

              虚拟函数与多态(Polymorphism) 



                  我曾经说过,前一个例子没有办法完成这样的动作: 



                      CShape shapes'5'; 



                      。。。 //   5   shapes  

                             令  个       各为矩形、四方形、椭圆形、圆形、三角形 



                      for  (int i=0; idisplay(); 



                 Ellipse   Square  Triangle  Rect    Circle   Square   Circle   Circle 



                  为了支持这种能力,C++ 提供了所谓的虚拟函数(virtual function )。 



                     +    ?!  

                  虚拟  函数    听起来很恐怖的样子。如果你了解汽车的离合器踩下去代表汽车空档, 



                  空档表示失去引擎本身的牵制力,你就会了解「高速行驶间煞车绝不能踩离合器」的道 



                  理并矢志遵行。好,如果你真的了解为什么需要虚拟函数以及什么情况下需要它,你就 



                  能够掌握它的灵魂与内涵,真正了解它的设计原理,并且发现认为它非常人性。并且, 



                  真正知道怎么用它。 



62 


…………………………………………………………Page 125……………………………………………………………

让我用另一个例子来展开我的说明。这个范例灵感得自Visual C++ 手册之一: 



Introdoction to C++。假设你的类别种类如下: 



                                                   CEmployee 

                                                    CEmployee 



                                          CManager              CWage 

                                           CManager              CWage 



                                                                CSales 

                                                                 CSales 



本图以Visual C++ 之「Class Info 窗口」获得 



程序代码实作如下: 



#0001  #include  

#0002 

#0003  //……………………………………………………………………………………………………………………………………………………………………

#0004  class CEmployee   // 职员 

#0005  { 

#0006  private: 

#0007  char m_
返回目录 上一页 下一页 回到顶部 0 1
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!