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

隨筆 - 55  文章 - 15  trackbacks - 0
<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

常用鏈接

留言簿

隨筆分類

隨筆檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

一個函數接受一個基類的指針或者引用,傳入一個子類的指針或者引用(向上類型轉換),希望調用子類的相應函數。目的:以后添加新的子類,都可以傳入該函數。
早綁定:編譯器通過上下文,判斷該函數屬于哪個對象,并在編譯期將函數名與函數地址綁定。
晚綁定:在運行的時候,判斷該函數屬于哪個對象,并在運行時將函數名與函數地址綁定。必須有類型信息裝在對象自身中。
聲明時添加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)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品成人| 亚洲理论在线| 欧美激情影院| 欧美fxxxxxx另类| 欧美大片在线观看| 欧美日韩国产999| 欧美日韩mp4| 国产精品女人网站| 国产亚洲欧美一区二区| 国产有码在线一区二区视频| 韩国成人福利片在线播放| 亚洲第一精品电影| 中日韩午夜理伦电影免费| 午夜亚洲伦理| 欧美福利精品| 日韩一区二区精品葵司在线| 午夜国产精品视频免费体验区| 欧美在线亚洲在线| 欧美高清视频一区二区三区在线观看| 欧美美女bb生活片| 国产日韩欧美三区| 亚洲精品四区| 久久精品毛片| 亚洲人在线视频| 亚洲一区二区三区高清| 久久视频在线看| 国产精品久久久久久久7电影| 韩国一区二区三区在线观看| 一区二区三区国产在线观看| 久久久久久久成人| 一本色道久久综合亚洲精品不| 欧美一区二区三区视频在线| 欧美成人午夜免费视在线看片 | 久久精品在线| 欧美视频在线一区二区三区| 激情视频亚洲| 欧美一区二区视频网站| 亚洲精品国产精品乱码不99按摩| 新67194成人永久网站| 欧美日韩日本视频| 亚洲黄色一区| 久久亚洲国产成人| 亚洲午夜女主播在线直播| 欧美mv日韩mv国产网站app| 国产欧美一区二区三区视频| 在线视频欧美一区| 亚洲国产中文字幕在线观看| 久久久91精品国产一区二区三区| 日韩午夜在线播放| 欧美www视频在线观看| 激情五月***国产精品| 欧美中文字幕在线视频| 亚洲私拍自拍| 国产精品久久久99| 亚洲一区二区在线免费观看| 亚洲欧洲精品一区二区三区波多野1战4| 欧美在线视频一区二区三区| 国产日韩欧美亚洲一区| 欧美伊人久久大香线蕉综合69| 99精品国产在热久久| 欧美日韩国产区一| 亚洲视频在线二区| 亚洲视频第一页| 国产精品成av人在线视午夜片| 999在线观看精品免费不卡网站| 亚洲第一在线综合网站| 免费看亚洲片| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲国产女人aaa毛片在线| 欧美成人a视频| 99热精品在线| 这里只有精品视频在线| 国产视频精品网| 久久久水蜜桃| 久久综合久久综合久久| 日韩亚洲欧美综合| 中文日韩在线视频| 国产在线视频不卡二| 美女脱光内衣内裤视频久久网站| 久热综合在线亚洲精品| 亚洲乱码国产乱码精品精可以看| 亚洲精品综合| 国产视频久久网| 欧美成人免费视频| 欧美三级午夜理伦三级中文幕| 性伦欧美刺激片在线观看| 久久精品免费电影| 中日韩高清电影网| 久久精品一二三区| 中文亚洲视频在线| 久久精品国产综合| 在线亚洲免费视频| 久久电影一区| 亚洲一区二区免费| 久久人人精品| 亚洲欧美第一页| 久久久综合香蕉尹人综合网| 日韩午夜精品视频| 欧美综合国产| 亚洲一区二区三区久久 | 亚洲手机视频| 伊人影院久久| 一本色道久久综合亚洲精品婷婷| 国产在线拍揄自揄视频不卡99 | 亚洲毛片av在线| 精品成人在线| 国产精品99久久久久久久女警| 另类亚洲自拍| 欧美一区二区三区四区在线观看 | 久久久激情视频| 欧美日韩视频在线一区二区| 麻豆av一区二区三区久久| 欧美午夜不卡在线观看免费| 麻豆精品精品国产自在97香蕉| 欧美亚男人的天堂| 亚洲国产欧美不卡在线观看| 国产亚洲欧美一级| 亚洲一二三区精品| 亚洲美女一区| 另类天堂av| 久久亚洲综合| 国产精品网站在线播放| 99亚洲精品| 日韩亚洲一区在线播放| 美国十次了思思久久精品导航| 欧美一区亚洲| 国产精品免费小视频| 日韩一级不卡| 一区二区三区免费观看| 欧美精品激情| 亚洲人成亚洲人成在线观看图片| 一区二区三区在线高清| 欧美与黑人午夜性猛交久久久| 亚洲欧美精品伊人久久| 欧美色一级片| 亚洲色在线视频| 亚洲欧美中文字幕| 国产精品男女猛烈高潮激情| 一区二区三区国产精品| 亚洲视频一区二区| 国产精品国码视频| 亚洲小视频在线观看| 亚洲欧美在线x视频| 国产精品久久91| 亚洲一区二区三区乱码aⅴ| 性欧美暴力猛交69hd| 国产欧美视频一区二区| 欧美一区二区三区视频| 免费欧美高清视频| 亚洲日韩第九十九页| 欧美精品七区| 亚洲午夜日本在线观看| 久久福利精品| 亚洲国产欧美在线| 欧美另类99xxxxx| 一本高清dvd不卡在线观看| 午夜激情综合网| 国产一区白浆| 欧美69wwwcom| 一区二区免费在线视频| 欧美一区二区视频在线| 在线观看国产日韩| 欧美日韩午夜| 久久超碰97人人做人人爱| 欧美大片网址| 亚洲免费在线观看| 樱桃国产成人精品视频| 欧美日韩国产综合视频在线观看| 亚洲一区黄色| 亚洲国产日韩美| 欧美中文字幕视频在线观看| 亚洲国产激情| 国产精品视频在线观看| 久久人人九九| 亚洲一区二区三区中文字幕| 在线精品视频在线观看高清| 欧美电影免费观看| 亚洲欧美激情精品一区二区| 欧美成人一区二区三区片免费| 亚洲已满18点击进入久久| 精品动漫一区| 国产伦精品一区二区三区免费 | 欧美 日韩 国产精品免费观看| 一区二区三区欧美日韩| 欧美jizz19性欧美| 亚洲欧美另类在线| 亚洲国产精品va在看黑人| 国产精品久久久久影院色老大 | 亚洲视频一区在线观看| 狠狠综合久久av一区二区老牛| 欧美日韩亚洲天堂| 美女网站久久| 欧美在线视屏| 亚洲欧美不卡| 亚洲午夜av| 一区二区三区高清| 亚洲美女黄网| 91久久国产综合久久| 免费成人黄色| 噜噜噜噜噜久久久久久91|