青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C+之父力作學習筆記6——派生類

      現在來考慮做一個程序,處理某公司所雇傭人員的問題。這個程序可能包含如下一種數據結構:
struct Employee
{
    
string first_name,family_name;
    
char middle_initial;
    Date hiring_date;
    
short department;
    
//
}
;
下一步我們可能需要去定義經理:
struct Manager
{
    Employee emp;
    list
<Employee*> group; //所管理的人員
    short level;
    
//
}
;
一個經理同時也是一個雇員,所以在Manager對象的emp成員存儲著Employee數據。很明顯這樣的設計是糟糕的,大家都會想到派生:
struct Manager:public Employee
{
    list
<Employee*> group;
    
short level;
}
;
這個Manager是由Employee派生的,反過來就是說,Employee是Manager的一個基類。類Manager包含類Employee得所有成員,再加上它自己的一些成員。
      按照這種方式從Employee派生出Manager,就使Manager成為Employee的一個子類型,使Manager可以用在能夠接受Employee的任何地方。因為Manager是Employee,所以Manager*就可以當做Employee*使用。然而,因為Employee不一定是Manager,所以Employee*就不能當做Manager*用。總而言之類Derived有一個公用基類Base,那么就可以用Derived*給Base*類型的變量賦值,不需要顯示的類型轉換。而相反的方向,從Base*到Derived*則必須顯示轉換。例如:
void g(Manager mm,Employee ee)
{
    Employee
* pe = &mm;  //可以:Manager都是Employee
    Manager* pm = &ee;   //錯誤:Employee不一定是Manager
    pm->level = 2;       //災難:ee沒有level
    pm = static_cast<Manager*>(pe);//蠻力:這個可以,因為pe指向的是Manager mm
    pm->level = 2;       //沒問題
}

      派生類的成員可以使用其基類的公用的和保護的成員,但是,派生類不能使用基類的私有成員。對于派生類的成年公園而言,保護成員就像是公用成員;但對于其他函數它們則像是私用成員。
      下面說說派生類的構造函數和析構函數
      有些派生類需要構造函數。如果某個基類中有構造函數,那么就必須調用這些構造函數中的某一個。默認構造函數可以被隱含的調用,但是,如果一個基類的所有構造函數都有參數,那么就必須顯示的調用其中的某一個。基類構造函數的參數應在派生類構造函數的定義中有明確描述。在這方面,基類的行為恰恰就像是派生類的一個成員。例如:
Employee::Employee(const string& n,int d):family(n),department(d)
{
    
//
}


Manager::Manager(
const string& n,int d,int lvl):Employee(n,d),/*初始化基類*/level(lvl)/*初始化成員*/
{
    
//
}
派生類的構造函數只能描述它自己的成員和自己的直接基類的初始式,它不能直接去初始化基類的成員,例如:
Manager::Manager(const string& n,int d,int lvl):family_name(n).department(d),level(lvl)//錯誤:在Manager里沒有family_name和department的聲明
{
//
}
 類對象的構造是自下而上進行的:首先是基類,而后是成員,再后才是派生類本身。類對象的銷毀則正好以相反的順序進行:首先是派生類本身,而后是成員,再后才是基類。
      對于給定的一個類型為Base*的指針,被指的對象到底屬于哪個派生類型呢?這個問題有四種基本的解決方案:
  1.  保證被指的只能是唯一類型的對象
  2. 在基類里安排一個類型域,供函數檢查
  3.  使用dynamic_cast
  4.  使用虛函數  

       從Employee的函數中取得“正確的”行為i,而又不依賴于實際使用的到底是哪一種Employee,這就是所謂的多態性。一個帶有虛函數的類型被稱為是一個多態類型。要在C++里取得多態行為,被調用的函數就必須是虛函數,而對象則必須是通過指針或者引用去操作的。如果直接操作一個對象(而不是通過指針或引用),它的確切類型就已經為編譯器所知,因此也就不需要運行時的多態性了。
      那么一個虛函數聲明為純虛函數,則這個虛函數所在的類為抽象類。用=0作為初始式就使虛函數成為“純虛的”。注意:不能創建抽象類的對象。抽象類只能做界面,作為其他類的基類。還有一點也要指的注意,一個未在派生類里定義的純虛函數仍舊還是一個純虛函數,這種情況也將使該派生類仍為一個抽象類。例如:

class Shape
{
     
public:
        
virtual void draw()=0;
        
virtual bool isClose()=0;
     
//
}
;

class Circel:public Shape
{
    
public:
       
bool isClose(){return true;}//覆蓋Shap::isClose
       
//draw尚未覆蓋
}
;

Circel a;//錯誤:聲明的是抽象類Circel對象

抽象類的最重要用途就使提供一個界面,而又不是暴露任何實現的細節。
      
     忠告 :

  • 避免類型域
  • 用抽象類將設計的中心集中到提供清晰的界面方面
  • 用抽象類使界面最小化
  • 一個有虛函數的類應該有一個虛析構函數
  • 抽象類通常不需要構造函數

posted on 2011-08-28 17:20 Daywei 閱讀(2011) 評論(0)  編輯 收藏 引用 所屬分類: C++之父力作學習筆記

<2013年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

導航

統計

常用鏈接

留言簿

隨筆分類

隨筆檔案

文章檔案

牛人博客

搜索

積分與排名

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美专区日韩视频| 欧美成人精品在线播放| 欧美日韩一区视频| 欧美日本中文字幕| 欧美日韩国产一级片| 欧美日韩视频不卡| 国产精品第一区| 国产日韩欧美综合在线| 国产一区二区三区在线观看视频| 久久电影一区| 美女久久网站| 久久精品国产一区二区三区| 99日韩精品| 亚洲桃花岛网站| 欧美一区二区精品| 欧美成ee人免费视频| 亚洲黄色av| 狼狼综合久久久久综合网| 欧美电影在线免费观看网站| 国产精品久久午夜| 国产九九视频一区二区三区| 在线免费一区三区| 亚洲图中文字幕| 久久九九国产精品怡红院| 男人的天堂亚洲| 亚洲午夜av电影| 久久综合图片| 国产伦精品一区二区三区视频孕妇| 狠狠色综合播放一区二区| 亚洲免费电影在线观看| 久久不射电影网| 亚洲高清在线观看| 午夜精品久久久久久久99热浪潮| 免费h精品视频在线播放| 国产精品福利网站| 亚洲黄色在线观看| 久久精品在线视频| 亚洲欧洲在线免费| 国产欧美精品久久| 夜夜精品视频一区二区| 久久婷婷一区| 正在播放亚洲一区| 欧美激情综合色| 娇妻被交换粗又大又硬视频欧美| 亚洲图片在区色| 亚洲黄色影院| 久热精品视频在线观看一区| 国产日韩成人精品| 亚洲欧美一区二区激情| 亚洲精品乱码视频| 麻豆成人在线播放| 黑丝一区二区| 久久精品在线视频| 羞羞色国产精品| 国产精品一区二区三区四区五区 | 亚洲一级在线| 欧美日韩在线播| 亚洲卡通欧美制服中文| 美女视频黄 久久| 久久精品国产99| 国产一区二区三区视频在线观看 | 亚洲一区黄色| 亚洲三级色网| 欧美三级在线视频| 亚洲视频电影图片偷拍一区| 9i看片成人免费高清| 欧美日韩日本网| 一本一本a久久| 日韩午夜中文字幕| 国产精品成人va在线观看| 亚洲视频在线观看免费| 一本不卡影院| 国产精品乱码| 久久久久久久久综合| 欧美一站二站| 精东粉嫩av免费一区二区三区| 久久久国产精品一区二区中文 | 欧美一区二区啪啪| 1024国产精品| 亚洲国产精品久久| 欧美日韩免费在线观看| 欧美一区二区女人| 欧美资源在线| 亚洲黄网站在线观看| 91久久久久久久久| 国产精品国产成人国产三级| 欧美尤物一区| 久久久欧美精品sm网站| 亚洲精品一级| 亚洲网站在线播放| 激情亚洲网站| 亚洲毛片av在线| 国产午夜精品久久久久久免费视| 99ri日韩精品视频| 日韩一级片网址| 在线综合亚洲欧美在线视频| 国产精品美女999| 久久精品一区二区三区中文字幕| 久久综合电影| 亚洲视频一区在线观看| 欧美在线地址| 亚洲欧洲一二三| 亚洲图中文字幕| 亚洲国内在线| 亚洲欧美区自拍先锋| 亚洲成色最大综合在线| 一区二区三区黄色| 在线观看日韩av电影| 一区二区三区我不卡| 亚洲人成在线播放网站岛国| 久久精品女人| 亚洲精品国产拍免费91在线| 99国产精品久久久久久久| 国产日韩一区二区三区| 欧美福利电影网| 国产精品二区影院| 亚洲大胆在线| 国产亚洲aⅴaaaaaa毛片| 亚洲国产老妈| 黑人一区二区| 亚洲另类在线一区| 国产一区二区三区在线观看免费视频 | 国产日韩在线视频| 欧美区视频在线观看| 亚洲免费在线观看视频| 欧美日韩在线免费观看| 欧美激情亚洲精品| 亚洲国产高清在线观看视频| 亚洲最黄网站| 亚洲精品一区二区三区四区高清| 欧美亚洲一区二区在线| 中文亚洲免费| 欧美激情一区三区| 欧美激情一区在线| 亚洲成人原创| 久久九九热免费视频| 久久国产精品99久久久久久老狼| 欧美日韩免费观看一区二区三区| 亚洲高清电影| 亚洲国产另类 国产精品国产免费| 销魂美女一区二区三区视频在线| 亚洲精品国久久99热| 久久激情网站| 欧美在线视频免费播放| 久久大香伊蕉在人线观看热2| 国产一区二区三区日韩| 亚洲视频日本| 亚洲午夜成aⅴ人片| 欧美成人精品高清在线播放| 欧美不卡三区| 最新中文字幕亚洲| 欧美激情视频网站| 日韩一区二区久久| 亚洲午夜影视影院在线观看| 欧美色123| 亚洲欧美日韩在线| 久久精品99久久香蕉国产色戒| 国产视频在线观看一区| 久久精品一区二区三区中文字幕| 毛片精品免费在线观看| 亚洲欧洲日韩综合二区| 欧美精品一区在线发布| 99人久久精品视频最新地址| 午夜精品免费在线| 国产一区二区久久精品| 久久久精彩视频| 亚洲国产成人久久| 亚洲视频在线观看一区| 国产拍揄自揄精品视频麻豆| 久久久久久久综合| 亚洲精品免费一二三区| 亚洲欧美日韩中文播放| 狠狠综合久久av一区二区小说| 蜜臀99久久精品久久久久久软件 | 久久国产精品黑丝| 亚洲国产第一页| 亚洲欧美在线网| 在线精品国产欧美| 欧美午夜精彩| 久久久久久欧美| 夜夜嗨av一区二区三区四季av | 久久精品在线播放| 亚洲人www| 亚洲欧美日韩视频二区| 经典三级久久| 国产精品入口日韩视频大尺度| 久久另类ts人妖一区二区| 一本色道久久综合精品竹菊| 久久久久国产一区二区| 99re热这里只有精品视频| 国产精品午夜国产小视频| 免费高清在线视频一区·| 亚洲一区二区三区乱码aⅴ蜜桃女| 免费久久精品视频| 久久成人精品一区二区三区| 99天天综合性| 亚洲国产第一页| 国产一区二区三区在线观看精品 | 午夜精品在线| 亚洲精选一区二区|