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

隨筆 - 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>
            亚洲欧美激情一区二区| 久久综合给合久久狠狠狠97色69| 亚洲欧洲日本一区二区三区| 99国产精品99久久久久久粉嫩| 亚洲精品久久久蜜桃| 亚洲午夜91| 久久免费精品日本久久中文字幕| 免费久久精品视频| 99精品99| 久久久一二三| 欧美日韩国产精品| 国产日韩一区| 亚洲裸体视频| 久久亚洲视频| 亚洲伊人伊色伊影伊综合网| 久久免费99精品久久久久久| 国产精品一区二区三区久久| 18成人免费观看视频| 亚洲午夜一二三区视频| 亚洲综合色噜噜狠狠| 欧美人成在线| 亚洲国产一区二区三区高清| 欧美亚洲视频在线观看| 欧美大片在线看| 在线视频亚洲欧美| 欧美粗暴jizz性欧美20| 国产精品久久久久av| 亚洲国产婷婷| 一区二区三欧美| 麻豆久久婷婷| 亚洲第一成人在线| 99成人在线| 伊人蜜桃色噜噜激情综合| 欧美在线一区二区三区| 日韩午夜在线电影| 欧美成人免费小视频| 欧美亚洲专区| 美女精品一区| 欧美综合国产| 欧美片在线播放| 久久天天躁夜夜躁狠狠躁2022 | 亚洲亚洲精品在线观看| 亚洲欧美资源在线| 国产精品日韩欧美| 亚洲综合第一| 亚洲专区在线| 亚洲人成网站精品片在线观看| 久久一区激情| 国产精品入口夜色视频大尺度| 欧美福利网址| 国产一区在线免费观看| 久久亚洲美女| 国产精品毛片| 久久综合狠狠综合久久激情| 国产精品久久久久久久久久直播| 亚洲国产精品v| 欧美成人亚洲成人| 欧美99在线视频观看| 欧美1级日本1级| 夜夜爽99久久国产综合精品女不卡| 欧美激情国产精品| 欧美日韩国产成人在线91| 欧美激情2020午夜免费观看| 国产欧亚日韩视频| 欧美电影免费| 在线观看视频日韩| 久久综合伊人77777蜜臀| 久久久亚洲国产天美传媒修理工| 国产伦精品一区二区三区四区免费| 99视频超级精品| 在线视频日韩精品| 亚洲欧美国产日韩天堂区| 亚洲一区日韩在线| 欧美午夜在线| 麻豆久久婷婷| 国产精品mm| 亚洲午夜激情| 极品尤物av久久免费看 | 亚洲一线二线三线久久久| 欧美日韩中文字幕| 欧美成人官网二区| 亚洲精品一二区| 欧美精品在线一区| 一区二区三区高清| 午夜精品久久久久久99热| 欧美大尺度在线观看| 亚洲人被黑人高潮完整版| 激情欧美一区二区三区在线观看| 欧美在线免费观看| 亚洲性图久久| 国产人久久人人人人爽| 久久精品一级爱片| 性欧美1819性猛交| 国产亚洲日本欧美韩国| 一区二区精品| 久久精品女人的天堂av| 欧美亚洲成人精品| 久久精品视频免费| 亚洲国产视频一区| 午夜精品久久久| 亚洲第一主播视频| 欧美午夜精品电影| 久久激情综合| 性色av一区二区怡红| 在线观看成人小视频| 欧美日韩精品三区| 亚洲欧美国产精品桃花| 欧美成人免费在线观看| 亚洲一区二区三区在线视频| 好吊成人免视频| 欧美自拍丝袜亚洲| 日韩视频中文| 久热精品视频在线观看| 一区二区三区国产盗摄| 激情久久综艺| 国产精品高清网站| 欧美va亚洲va日韩∨a综合色| 亚洲五月六月| 亚洲高清在线精品| 亚洲三级网站| 国产日本欧洲亚洲| 欧美亚洲成人精品| 欧美电影免费观看高清| 欧美有码在线观看视频| 在线中文字幕一区| 亚洲精品久久久久中文字幕欢迎你 | 国产精品chinese| 美女视频一区免费观看| 欧美一级淫片aaaaaaa视频| 久久精品国产在热久久| 亚洲一区二区免费视频| 亚洲理论在线| 亚洲成色www久久网站| 国产视频欧美| 国产精品日韩在线| 欧美视频免费在线观看| 欧美成人午夜视频| 欧美成人精品影院| 久久综合精品国产一区二区三区| 欧美专区在线| 欧美资源在线观看| 欧美一级在线视频| 欧美一区二区在线播放| 亚洲欧美精品一区| 午夜精品久久久久久久久久久| 一区二区三区四区国产精品| av成人免费在线| 99在线|亚洲一区二区| 99re8这里有精品热视频免费 | 亚洲午夜精品国产| 一区二区三区产品免费精品久久75| 亚洲人成7777| 一本色道综合亚洲| 亚洲永久精品国产| 羞羞色国产精品| 久久精品99久久香蕉国产色戒 | 亚洲电影激情视频网站| 1024国产精品| 99riav1国产精品视频| 夜色激情一区二区| 亚洲一区国产一区| 久久国产精品久久精品国产| 久久久国产午夜精品| 亚洲卡通欧美制服中文| 一本色道久久88亚洲综合88| 亚洲视频狠狠| 亚洲国产精品综合| 亚洲乱码国产乱码精品精可以看| 一区二区三区免费在线观看| 亚洲影院免费| 久久久五月天| 亚洲国产91色在线| 中日韩男男gay无套| 欧美一区二区视频免费观看| 久久综合九色综合欧美就去吻| 欧美成人精品在线| 国产精品免费区二区三区观看| 国内精品免费午夜毛片| 亚洲精品一区二区在线| 亚洲在线观看视频网站| 看欧美日韩国产| 日韩午夜三级在线| 久久精品在线观看| 欧美日韩一区二区三区高清| 免费观看成人www动漫视频| 欧美人与性动交cc0o| 国产日韩专区| 一区二区久久久久久| 久久青草久久| 亚洲最新在线| 麻豆精品传媒视频| 国产毛片精品国产一区二区三区| 亚洲欧洲日本专区| 久久久久久婷| 一区二区三区鲁丝不卡| 免费黄网站欧美| 国户精品久久久久久久久久久不卡| 99视频一区| 欧美激情一区二区三区在线| 欧美一区二区三区在线视频|