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

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

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




                      。。。 

                     while (pEmp = anIter。getNext()) 

                      { 

                        count++; 

                        cout  put ePay while  

    因此如果上述       循环中调用的是                   ,那么     循环所执行的将 



    总是相同的运算,也就是CEmpl oyee::put ePay ,这就糟了(销售员领到经理的薪水还 



    不糟吗)。更糟的是,我们根本没有定义CEmpl oyee::put ePay ,因为CEmpl oyee  只 



    是个抽象概念(一个抽象类别)。指针必须落实到具象类型上如CWage 或CManager 或 



    CSales ,才有薪资计算公式。 



虚拟函数与一般化 



    我想你可以体会,上述的while 循环其实就是把动作「一般化」。「一般化」之所以重 



    要,在于它可以把现在的、未来的情况统统纳入考量。将来即使有另一种名曰「顾问」 



    的职员,上述计薪循环应该仍然能够正常运作。当然啦,「顾问」的put ePay 必须设 



    计好。 



     「一般化」是如此重要,解决上述问题因此也就迫切起来。我们需要的是什么呢?是能 



    够「依旧以CEmpoly ee 指针代表每一种职员」,而又能够在「实际指向不同种类之职员」 



    时,「调用到不同版本(不同类别中)之put ePay 」这种能力。 



    这种性质就是多态(polymorphism ),靠虚拟函数来完成。 



    再次看看那张计薪循环图: 



       pE mp             pE mp…》 put ePay  

    ■ 当     指向经理,我希望                   是经理的薪水计算式,也就是 



         CManager::put ePay 。 



       pE mp               pE mp …》put ePay  

    ■ 当     指向销售员,我希望                    是销售员的薪水计算式,也就 



       是CSales ::put ePay 。 



       pE mp                pE mp …》put ePay  

    ■ 当     指向时薪职员,我希望                    是时薪职员的薪水计算式, 



       也就是CWage::put ePay 。 



    虚拟函数正是为了对「如果你以一个基础类别之指针指向一个衍生类别之对象,那么透 



    过该指针你就只能够调用基础类别所定义之成员函数」这条规则反其道而行的设计。 



                                                                        71 


…………………………………………………………Page 134……………………………………………………………

                    不必设计复杂的串行函数如add 或getNext 才能验证这件事,我们看看下面这个简单例 



                    子。如果我把职员一例中所有四个类别的put ePay  函数前面都加上virtual 保留字, 



                    使它们成为虚拟函数,那么: 



                      CEmployee* pEmp; 

                      CWage      aWager(〃曾銘源〃); 

                      CSales     aSales(〃侯俊傑〃); 

                      CManager   aManager(〃陳美靜〃); 



                      pEmp = &aWager; 

                      cout putePay();  //           CWage::putePay 

                                                        调用的是 

                      pEmp = &aSales; 

                      cout putePay();  //           CSales::putePay 

                                                        调用的是 

                      pEmp = &aManager; 

                      cout putePay();  //           CManager::putePay 

                                                        调用的是 

                                                        调用的是 



                   现在重新回到Shape 例子,我打算让displ ay 成为虚拟函数: 



                  #0001  #include  

                  #0002  class CShape 

                  #0003  { 

                  #0004    public: 

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