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

隨筆 - 55  文章 - 15  trackbacks - 0
<2012年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用鏈接

留言簿

隨筆分類

隨筆檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

一個函數接受一個基類的指針或者引用,傳入一個子類的指針或者引用(向上類型轉換),希望調用子類的相應函數。目的:以后添加新的子類,都可以傳入該函數。
早綁定:編譯器通過上下文,判斷該函數屬于哪個對象,并在編譯期將函數名與函數地址綁定。
晚綁定:在運行的時候,判斷該函數屬于哪個對象,并在運行時將函數名與函數地址綁定。必須有類型信息裝在對象自身中。
聲明時添加virtual關鍵字,定義時不需要。

使用指針和引用的目的是讓編譯器不能完全知道該對象的確切類型,不然就會調用早綁定。晚綁定是根據VTABLE來實現,并且基類和子類的每個虛函數的排列順序都是相同的,所以調用函數的時候已經不是通過名字來調用,而是通過指令,通過函數地址的偏移量來調用了。

抽象基類的意義,為子類提供一個公共的接口。

通過基類指針調用基類中不存在的函數是危險的,因為,也許你恰好知道子類對象中有這個函數,那你的調用時成功的,但是萬一木有呢?
class Base(){
public:
 virtual void f(){}
};

class Derived1: public Base
{
public:
 virtual void f(){}
 virtual void g(){}
};
class Derived2: public Base
{
public:
 virtual void f(){}
 virtual void m(){}
};

void func(Base* b){
b->g();
}
int main{
Base*Test1 = new Derived1;
Base*Test2 = new Derived2;
func(Test1);// right;
func(Test2);// crash
}

這里涉及到運行時類型識別(RTTI)和向下類型轉換問題。向下類型轉換不安全,因為沒有類型信息,基類指針不知道基類的內存塊之后的東西是屬于哪個子類的,如果轉錯,將會比較麻煩。

在編程時注意防止對象的切片,如果按傳值方式而不是傳址和傳引用方式
將子類對象傳入一個接受基類對象的函數中去的話,那么,只拷貝子類對象中基類的部分數據,又因為編譯器能明確地知道該對象的類型,所以不會產生晚綁定,而是早綁定。我們應該避免在這種情況下傳值。

如果重新定義了基類中的虛函數,則基類中其他重載版本將被隱藏。(同非虛函數一樣)
如果重載了基類中的虛函數,則基類中其他版本將被隱藏(同非虛函數一樣)
不能在子類中修改基類中虛函數的返回值(非虛函數可以修改返回值,并且隱藏其他重載版本)
但是,也有特例
class PetFood{
public:
  virtual string foodType() const = 0;
};

class Pet{
public:
  virtual string type() const = 0;
  virtual PetFood* eat() = 0;
};

class Bird : public Pet{
public:
  string type()const {return "bird";}
  class BirdFood  :  public PetFood{
    public:
      string foodType()const{
         return "Bird food";
       }
     };
   PetFood* eat(){ return &bf;}
private:
   BirdFood bf;
};

class Cat: public Pet{
public:
  string type()const {return "cat";}
  class CatFood  :  public PetFood{
    public:
      string foodType()const{
         return "Cat food";
       }
     };
   CatFood* eat(){ return &cf;}// Here, you can return a CatFood*, because it's a PetType* type. Why don't return a type as PetFood? See segment in main()
private:
   CatFood cf;
};

int main(){
 Bird b;
 Cat c;
 Cat::CatFood* cf = c.eat();
 Bird::BirdFood* bf = b.eat();//downcast, warning!!!Cast PetFood* to BirdFood. So you better return a special pointer, not a base type.
}
}
返回確切的類型要更通用些。

vptr vtable由誰來初始化?構造函數?是編譯器插入一小段代碼在構造函數中初始化。
派生類只訪問它自己的成員,而不訪問基類的成員。只有基類的構造函數才能正確地初始化自己的成員。所以要在構造函數中:子要可能,我們應該在這個構造函數初始化列表中從初始化所有的成員對象(通過組合置于類中),因為你必須保證所有的東西都被初始化了,才能使用該對象。

在構造函數中調用虛函數,調用的只是本地版本。
原因:該對象還未初始完畢,但是vptr已經初始化,而且指向自己的vtable,所以調用的只是本地的函數。


1
posted on 2012-06-04 16:27 Dino-Tech 閱讀(241) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产欧美日韩综合一区在线观看| 亚洲第一毛片| 欧美亚洲午夜视频在线观看| 亚洲视频播放| 国产一区二区三区高清播放| 久久久久久久91| 男女av一区三区二区色多| 91久久精品国产91久久| 亚洲激情在线播放| 欧美日韩国产限制| 欧美一级淫片aaaaaaa视频| 午夜免费久久久久| 亚洲人www| 一区二区日韩| 精品成人国产在线观看男人呻吟| 欧美不卡一区| 国产精品毛片| 欧美不卡高清| 国产精品久久久久一区二区三区共 | 欧美国产先锋| 亚久久调教视频| 免费高清在线视频一区·| 亚洲视频香蕉人妖| 久久爱www久久做| 一区二区av在线| 久久国产精品99精品国产| 亚洲精品中文字幕在线| 午夜精品久久久久久久白皮肤 | 欧美日本在线视频| 欧美中文字幕在线播放| 欧美福利电影网| 久久国产99| 欧美日本高清| 欧美~级网站不卡| 国产精品美女www爽爽爽视频| 欧美高清视频一区| 国产日韩精品视频一区二区三区| 亚洲高清在线播放| 国产偷自视频区视频一区二区| 亚洲国内欧美| 在线观看免费视频综合| 亚洲影院色在线观看免费| 亚洲精品在线视频观看| 久久午夜国产精品| 欧美在线免费看| 欧美视频一区| 91久久综合亚洲鲁鲁五月天| 又紧又大又爽精品一区二区| 亚洲欧美在线播放| 亚洲欧美一区二区激情| 欧美精品在线极品| 亚洲丰满少妇videoshd| 精品成人一区二区| 欧美与黑人午夜性猛交久久久| 亚洲欧美一区二区视频| 欧美日韩在线亚洲一区蜜芽| 亚洲精品国产精品乱码不99按摩| 亚洲国产经典视频| 久久国产精品毛片| 久久久久9999亚洲精品| 国产一区二区三区网站| 欧美有码在线观看视频| 久久精品国产91精品亚洲| 国产日韩欧美视频| 午夜精品亚洲| 久久久精品视频成人| 国产专区欧美精品| 久久国产日本精品| 久久在线91| 亚洲国产欧美一区| 欧美激情国产日韩精品一区18| 农村妇女精品| 亚洲精品中文字幕在线| 欧美激情中文字幕在线| 99re热这里只有精品免费视频| 一区二区国产日产| 国产精品国产三级国产aⅴ入口 | 亚洲精品久久久蜜桃| 日韩一二三区视频| 欧美视频四区| 性欧美18~19sex高清播放| 久久激情综合| 亚洲国产成人久久| 欧美日韩国产成人在线91| 在线一区亚洲| 久久久国产精彩视频美女艺术照福利 | 国产精品99久久久久久久久 | 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲国产天堂久久综合| 日韩一级精品视频在线观看| 欧美视频日韩视频| 先锋影音网一区二区| 欧美福利视频| 亚洲一区二区三区四区中文| 国产日韩欧美精品一区| 免费成人在线观看视频| 在线一区视频| 女人色偷偷aa久久天堂| 亚洲视频导航| 激情小说另类小说亚洲欧美| 欧美精品一区二区三区在线看午夜 | 久久综合色一综合色88| 亚洲美女精品一区| 久久久www| 宅男精品视频| 樱花yy私人影院亚洲| 欧美区在线观看| 久久精品国产亚洲一区二区| 亚洲日本欧美| 久热精品视频| 亚洲欧美三级伦理| 亚洲精品视频一区二区三区| 国产亚洲免费的视频看| 欧美片第1页综合| 久久精品伊人| 亚洲影视综合| 亚洲另类一区二区| 欧美成人激情视频免费观看| 欧美一级专区免费大片| 日韩性生活视频| 亚洲国产精品www| 国产丝袜一区二区三区| 欧美日韩精品在线| 欧美xx69| 久久免费视频一区| 欧美亚洲综合久久| 亚洲永久字幕| 宅男噜噜噜66一区二区| 亚洲日本va午夜在线影院| 蜜臀a∨国产成人精品| 欧美伊人久久久久久午夜久久久久| 99视频在线观看一区三区| 亚洲大胆视频| 1000部国产精品成人观看| 国内精品久久久久久| 国产精品永久在线| 国产精品视频一二| 国产精品久久久一区二区| 国产精品igao视频网网址不卡日韩| 欧美电影免费网站| 能在线观看的日韩av| 免费短视频成人日韩| 久久亚洲午夜电影| 美腿丝袜亚洲色图| 美女在线一区二区| 免费一级欧美片在线观看| 猛男gaygay欧美视频| 美腿丝袜亚洲色图| 欧美激情精品| 欧美三级日韩三级国产三级| 欧美日韩性视频在线| 欧美三级视频在线| 国产精品免费网站在线观看| 国产精品久久综合| 国产性猛交xxxx免费看久久| 国产在线国偷精品产拍免费yy| 国产综合网站| 亚洲日本中文字幕| 亚洲视频免费| 欧美一级理论片| 开心色5月久久精品| 欧美国产第一页| 亚洲精品在线观看视频| 亚洲婷婷综合色高清在线| 先锋影音一区二区三区| 久久午夜精品一区二区| 欧美精品国产一区| 国产精品男女猛烈高潮激情| 国产日韩欧美亚洲| 亚洲精品小视频在线观看| 亚洲一区免费在线观看| 久久爱www久久做| 欧美国产精品劲爆| 亚洲小视频在线观看| 欧美一区二区精品在线| 欧美sm视频| 国产免费一区二区三区香蕉精| 在线观看亚洲视频| 亚洲伊人观看| 欧美激情女人20p| 亚洲一区二区三区高清| 免费国产一区二区| 国产乱码精品一区二区三| 亚洲国产91| 欧美在线影院| 日韩视频在线免费| 久久男女视频| 国产精品网站视频| 99re6这里只有精品| 久久久久久久999精品视频| 日韩一本二本av| 久久青青草综合| 亚洲福利在线视频| 亚洲欧美日韩国产另类专区| 欧美激情女人20p| 精品69视频一区二区三区| 亚洲欧美在线aaa| 亚洲精品美女91| 麻豆av一区二区三区久久| 国产日产亚洲精品|