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

隨筆 - 55  文章 - 15  trackbacks - 0
<2012年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿

隨筆分類

隨筆檔案

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

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

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

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

通過基類指針調(diào)用基類中不存在的函數(shù)是危險(xiǎn)的,因?yàn)椋苍S你恰好知道子類對(duì)象中有這個(gè)函數(shù),那你的調(diào)用時(shí)成功的,但是萬一木有呢?
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
}

這里涉及到運(yùn)行時(shí)類型識(shí)別(RTTI)和向下類型轉(zhuǎn)換問題。向下類型轉(zhuǎn)換不安全,因?yàn)闆]有類型信息,基類指針不知道基類的內(nèi)存塊之后的東西是屬于哪個(gè)子類的,如果轉(zhuǎn)錯(cuò),將會(huì)比較麻煩。

在編程時(shí)注意防止對(duì)象的切片,如果按傳值方式而不是傳址和傳引用方式
將子類對(duì)象傳入一個(gè)接受基類對(duì)象的函數(shù)中去的話,那么,只拷貝子類對(duì)象中基類的部分?jǐn)?shù)據(jù),又因?yàn)榫幾g器能明確地知道該對(duì)象的類型,所以不會(huì)產(chǎn)生晚綁定,而是早綁定。我們應(yīng)該避免在這種情況下傳值。

如果重新定義了基類中的虛函數(shù),則基類中其他重載版本將被隱藏。(同非虛函數(shù)一樣)
如果重載了基類中的虛函數(shù),則基類中其他版本將被隱藏(同非虛函數(shù)一樣)
不能在子類中修改基類中虛函數(shù)的返回值(非虛函數(shù)可以修改返回值,并且隱藏其他重載版本)
但是,也有特例
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由誰來初始化?構(gòu)造函數(shù)?是編譯器插入一小段代碼在構(gòu)造函數(shù)中初始化。
派生類只訪問它自己的成員,而不訪問基類的成員。只有基類的構(gòu)造函數(shù)才能正確地初始化自己的成員。所以要在構(gòu)造函數(shù)中:子要可能,我們應(yīng)該在這個(gè)構(gòu)造函數(shù)初始化列表中從初始化所有的成員對(duì)象(通過組合置于類中),因?yàn)槟惚仨毐WC所有的東西都被初始化了,才能使用該對(duì)象。

在構(gòu)造函數(shù)中調(diào)用虛函數(shù),調(diào)用的只是本地版本。
原因:該對(duì)象還未初始完畢,但是vptr已經(jīng)初始化,而且指向自己的vtable,所以調(diào)用的只是本地的函數(shù)。


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

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   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>
            久久天堂av综合合色| 久久色在线播放| 一区二区三区久久| 欧美综合国产| 国产精品国产三级国产a| 1024亚洲| 欧美成年人在线观看| 亚洲欧美久久久| 国产精品国色综合久久| 亚洲视频碰碰| 亚洲三级网站| 久久不射中文字幕| 国产美女精品免费电影| 欧美一区精品| 小嫩嫩精品导航| 国产一区二区三区成人欧美日韩在线观看 | 亚洲欧洲一区| 久久久精品国产免大香伊| 中日韩高清电影网| 国产精品免费一区豆花| 久久激情网站| 久久天天综合| 亚洲精品国精品久久99热| 亚洲国产精品一区二区尤物区| 久久久999国产| 亚洲国产日韩欧美在线图片| 亚洲国产精品女人久久久| 欧美精品久久99久久在免费线| 91久久精品国产91久久| 亚洲人成人一区二区三区| 欧美va亚洲va国产综合| 99成人在线| 亚洲图片你懂的| 国产在线播精品第三| 免费在线欧美黄色| 欧美精品自拍| 欧美一区二区在线看| 久久影音先锋| 在线一区二区视频| 午夜精品久久久久久久久久久久| 激情久久综合| 99精品国产热久久91蜜凸| 国产欧美日韩综合精品二区| 免费观看亚洲视频大全| 欧美日韩在线视频一区二区| 亚洲精品久久久蜜桃| 亚洲欧美国产高清| 国产精品视频免费观看| 久久精品在这里| 欧美aⅴ99久久黑人专区| 亚洲视频精品在线| 久久精品国产视频| 一区二区日韩伦理片| 欧美在线一级va免费观看| 亚洲国产精品专区久久| 亚洲一区二区欧美| 亚洲国产精品久久久久秋霞影院| 夜夜嗨av一区二区三区免费区| 国语自产精品视频在线看8查询8| 亚洲日本免费电影| 国内精品免费午夜毛片| 亚洲日本激情| 激情久久久久| 亚洲综合色丁香婷婷六月图片| 最新中文字幕亚洲| 欧美一区二区三区四区在线观看| 一区二区激情小说| 久久一本综合频道| 欧美一区1区三区3区公司| 欧美精品久久久久久久久久| 美日韩精品视频免费看| 国产精品久久久对白| 亚洲国产一区二区三区a毛片| 国产一区二区三区四区老人| 正在播放亚洲| 亚洲美女免费视频| 老司机免费视频久久| 久久久久久久网站| 国产欧美精品在线| 亚洲综合欧美日韩| 亚洲欧美在线看| 国产精品第2页| 99v久久综合狠狠综合久久| 最新中文字幕亚洲| 蜜桃av综合| 六月婷婷久久| 黄色成人av网站| 欧美伊人久久久久久久久影院 | 亚洲欧美日本国产有色| 欧美日韩一区二区在线视频 | 亚洲欧美国产高清| 性欧美1819sex性高清| 国产精品国产馆在线真实露脸| 亚洲欧洲日本一区二区三区| 亚洲国产日韩在线一区模特| 麻豆亚洲精品| 欧美国产日韩一区| 最新精品在线| 欧美另类高清视频在线| 亚洲九九爱视频| 亚洲欧美春色| 国产视频一区在线观看一区免费| 性色av一区二区三区| 久久裸体艺术| 亚洲黄色在线观看| 欧美激情无毛| 日韩午夜av在线| 亚洲国产精品久久久久婷婷老年| 亚洲性图久久| 西西人体一区二区| 国产亚洲欧洲| 久久亚洲美女| 亚洲激情黄色| 亚洲一区在线免费| 国产欧美欧洲在线观看| 久久久91精品国产一区二区精品| 欧美电影免费观看| 一区二区三区国产| 国产情侣一区| 另类专区欧美制服同性| 亚洲欧洲日韩在线| 午夜久久美女| 伊人久久综合97精品| 欧美乱妇高清无乱码| 亚洲欧美不卡| 免费观看不卡av| 亚洲图片在线| 在线观看91精品国产入口| 欧美久久久久久| 亚洲女爱视频在线| 欧美激情久久久| 欧美一区二区视频在线观看2020 | 99国产精品视频免费观看| 国产精品草莓在线免费观看| 久久国产精品99精品国产| 亚洲国产精品久久久久| 欧美在线观看你懂的| 亚洲人成在线观看一区二区 | 香蕉成人伊视频在线观看| 狠狠久久亚洲欧美| 欧美精品久久久久a| 久久久精品国产一区二区三区| 99riav久久精品riav| 欧美高清在线一区| 欧美在线资源| 一区二区av在线| 亚洲第一色中文字幕| 国产精品永久免费| 欧美激情一区二区三区在线视频 | 国产精品亚洲综合色区韩国| 久久综合激情| 亚洲欧美在线观看| aa级大片欧美三级| 欧美激情国产日韩| 久热国产精品| 欧美制服丝袜第一页| 一区二区欧美精品| **网站欧美大片在线观看| 国产一区二区日韩精品| 欧美日韩免费一区二区三区| 美女国内精品自产拍在线播放| 亚洲欧美日韩人成在线播放| 99精品视频一区| 91久久国产综合久久91精品网站| 久久嫩草精品久久久久| 欧美一区深夜视频| 亚洲欧美在线看| 亚洲综合国产激情另类一区| 一本一本久久| 一本久道久久综合狠狠爱| 91久久线看在观草草青青| 狠狠色狠狠色综合日日tαg| 国产麻豆精品theporn| 国产精品久久久久久久久果冻传媒| 欧美另类69精品久久久久9999| 免费观看亚洲视频大全| 亚洲免费在线电影| 久久嫩草精品久久久精品| 欧美怡红院视频一区二区三区| 亚洲一区二区日本| 亚洲免费中文字幕| 亚洲一区在线播放| 亚洲综合首页| 亚洲欧美一区二区在线观看| 午夜精品婷婷| 久久久久www| 久久午夜精品| 久久精品一区四区| 久久影视精品| 欧美国产精品专区| 亚洲品质自拍| 一区二区三区国产精品| 亚洲欧美激情在线视频| 欧美综合国产| 欧美成人精品在线播放| 欧美日产国产成人免费图片| 国产精品va在线播放我和闺蜜| 国产精品欧美日韩| 精品av久久久久电影| 亚洲毛片在线免费观看|