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

Benjamin

靜以修身,儉以養(yǎng)德,非澹薄無以明志,非寧靜無以致遠(yuǎn)。
隨筆 - 398, 文章 - 0, 評論 - 196, 引用 - 0
數(shù)據(jù)加載中……

C++之virtual functions(虛函數(shù))實現(xiàn)細(xì)節(jié)及相關(guān)概念

c++中的(static) type和 (dynamic) type 概念是基于多態(tài)(polymorphism) ,例如:Vehicle*指針如果實際是指向一個Car對象,那么這個指針的靜態(tài)類型就是Vechicle,Car則是他的動態(tài)類型。靜態(tài)類型發(fā)生在編譯器編譯時,動態(tài)類型發(fā)生在動態(tài)綁定時。
我們常說的override(覆蓋)就是針對虛函數(shù)而言。
對虛函數(shù)的實現(xiàn)應(yīng)該說各個編譯器是不一樣的,大多數(shù)的編譯器是這樣的:
為每一個有虛函數(shù)的類增加一個虛表,這個虛表是靜態(tài)的,還有一個虛指針,為每個類對象。例如:
// Your original C++ source code
 class Base {
 public:
   virtual arbitrary_return_type virt0(...arbitrary params...);
   virtual arbitrary_return_type virt1(...arbitrary params...);
   virtual arbitrary_return_type virt2(...arbitrary params...);
   virtual arbitrary_return_type virt3(...arbitrary params...);
   virtual arbitrary_return_type virt4(...arbitrary params...);
   ...
 };
1 編譯器會為這個類的虛函數(shù)添加一個虛表,類似下面的:
// Pseudo-code (not C++, not C) for a static table defined within file Base.cpp
 
 // Pretend FunctionPtr is a generic pointer to a generic member function
 // (Remember: this is pseudo-code, not C++ code)
 FunctionPtr Base::__vtable[5] = {
   &Base::virt0, &Base::virt1, &Base::virt2, &Base::virt3, &Base::virt4
 };

2 然后增加一個指向虛表的指針為每一個類對象,這個指針是隱藏的
 // Your original C++ source code
 
 class Base {
 public:
   ...
   FunctionPtr* __vptr;  ← supplied by the compiler, hidden from the programmer
   ...
 };
3 編譯器在構(gòu)造中初始化這個指針
Base::Base(...arbitrary params...)
   : __vptr(&Base::__vtable[0])  ← supplied by the compiler, hidden from the programmer
   ...
 {
   ...
 }
在派生類中,它也會增加一個隱藏的虛表,但是它可以overrides基類的虛函數(shù)如:
// Pseudo-code (not C++, not C) for a static table defined within file Der.cpp
 
 // Pretend FunctionPtr is a generic pointer to a generic member function
 // (Remember: this is pseudo-code, not C++ code)
 FunctionPtr Der::__vtable[5] = {
   &Der::virt0, &Der::virt1, &Der::virt2, &Base::virt3, &Base::virt4
 };    

最后看看底層是如何調(diào)用的如:                                  
void mycode(Base* p)
 {
   p->virt3();
 }
主要三部分:
1.獲取隱藏的指向虛表的指針,并把它放在 register中如r1;
2.獲取指針r2=r1+3*4(假定一個指針有四個字節(jié)) ,并把它放到register中。
3 根據(jù)r2的地址調(diào)用函數(shù)。

所以說,調(diào)用一個虛函數(shù)至少和非虛函數(shù)差不多.
在這里我們可以看出一個虛指針的長度,至少是四個字節(jié),但是要注意編譯器對它的具體實現(xiàn)。

純虛函數(shù)怎樣用,下面的例子可以說明這個問題。
象下面的代碼就可以用純虛函數(shù)來實現(xiàn):
typedef std::vector<Vehicle*>  VehicleList;
 
 void myCode(VehicleList& v)
 {
   for (VehicleList::iterator p = v.begin(); p != v.end(); ++p) {
     Vehicle& v = **p;  // just for shorthand
 
     // generic code that works for any vehicle...
     ...
 
     // perform the "foo-bar" operation.
     // note: the details of the "foo-bar" operation depend
     // on whether we're working with a car or a truck.
     if (v is a Car) {
       // car-specific code that does "foo-bar" on car v
       ...
     } else if (v is a Truck) {
       // truck-specific code that does "foo-bar" on truck v
       ...
     } else {
       // semi-generic code that does "foo-bar" on something else
       ...
     }
 
     // generic code that works for any vehicle...
     ...
   }
 }
用純虛函數(shù)實現(xiàn)如下:
class Vehicle {
 public:
   // performs the "foo-bar" operation
   virtual void fooBar() = 0;
 };
typedef std::vector<Vehicle*>  VehicleList;
 
 void myCode(VehicleList& v)
 {
   for (VehicleList::iterator p = v.begin(); p != v.end(); ++p) {
     Vehicle& v = **p;  // just for shorthand
 
     // generic code that works for any vehicle...
     ...
 
     // perform the "foo-bar" operation.
     v.fooBar();
 
     // generic code that works for any vehicle...
     ...
   }
 }

也可以用繼承的方法來實現(xiàn)
class Car : public Vehicle {
 public:
   virtual void fooBar();
 };
 
 void Car::fooBar()
 {
   // car-specific code that does "foo-bar" on 'this'
   ...  ← this is the code that was in {...} of if (v is a Car)
 }
 
 class Truck : public Vehicle {
 public:
   virtual void fooBar();
 };
 
 void Truck::fooBar()
 {
   // truck-specific code that does "foo-bar" on 'this'
   ...  ← this is the code that was in {...} of if (v is a Truck)
 }
有純虛函數(shù)的是抽象基類,強(qiáng)迫派生類接受基類的接口并實現(xiàn),在COM(組件)中比較常見,。

virtual constructor(虛構(gòu)造)的一個實現(xiàn)方法之一:
class Shape {
 public:
   virtual ~Shape() { }                 // A virtual destructor
   virtual void draw() = 0;             // A pure virtual function
   virtual void move() = 0;
   ...
   virtual Shape* clone()  const = 0;   // Uses the copy constructor
   virtual Shape* create() const = 0;   // Uses the default constructor
 };
 
 class Circle : public Shape {
 public:
   Circle* clone()  const;   // Covariant Return Types; see below
   Circle* create() const;   // Covariant Return Types; see below
   ...
 };
 
 Circle* Circle::clone()  const { return new Circle(*this); }
 Circle* Circle::create() const { return new Circle();      }

void userCode(Shape& s)
 {
   Shape* s2 = s.clone();
   Shape* s3 = s.create();
   ...
   delete s2;    // You need a virtual destructor here
   delete s3;
 }
注意在VC6中必須寫成Shape*,VC7就不用改,支持返回類型可以變。

posted on 2009-06-13 17:38 Benjamin 閱讀(2490) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产日韩欧美亚洲| 国产一区二区三区直播精品电影| 韩日欧美一区二区三区| 久久九九免费视频| 久久精品伊人| 亚洲国产裸拍裸体视频在线观看乱了中文| 久久久久国产一区二区三区| 久久综合狠狠| 中文日韩欧美| 欧美影片第一页| 亚洲精品1234| 这里只有精品丝袜| 黄色成人在线免费| 日韩视频二区| 国语精品中文字幕| 亚洲区国产区| 国产精品亚洲综合天堂夜夜| 免费成人在线视频网站| 欧美另类高清视频在线| 午夜精品视频在线观看一区二区| 久久精品99国产精品日本| 亚洲精品欧美日韩| 亚洲欧美日韩久久精品| 亚洲欧洲中文日韩久久av乱码| 亚洲视频精品| 亚洲人成网站777色婷婷| 亚洲午夜久久久| 亚洲黄色毛片| 欧美一二三视频| 中文欧美在线视频| 久久综合电影一区| 欧美一区二区三区视频免费播放 | 亚洲精品小视频| 国产视频欧美视频| av不卡在线看| 亚洲片在线观看| 久久九九热免费视频| 亚洲自啪免费| 欧美久久久久久久| 免费久久久一本精品久久区| 国产精品制服诱惑| 一道本一区二区| 亚洲剧情一区二区| 久久综合五月| 久久字幕精品一区| 国产一区二区三区在线观看视频 | 亚洲国产va精品久久久不卡综合| 亚洲欧美欧美一区二区三区| 亚洲视频在线观看| 欧美电影电视剧在线观看| 噜噜噜噜噜久久久久久91| 国产亚洲成av人在线观看导航| 一本久道久久综合婷婷鲸鱼| 亚洲伦理久久| 欧美成人黑人xx视频免费观看| 免费不卡视频| 一区免费观看| 久久久免费精品| 麻豆精品视频在线观看| 狠狠色综合网| 久久亚洲午夜电影| 免费中文日韩| 亚洲国产午夜| 欧美国产精品人人做人人爱| 欧美电影免费观看高清完整版| 在线高清一区| 蜜臀av性久久久久蜜臀aⅴ| 欧美国产高潮xxxx1819| 亚洲国产精品久久久久久女王| 久久五月激情| 欧美大片在线看免费观看| 91久久精品视频| 欧美日本视频在线| 一区二区三区高清| 欧美中文在线观看国产| 国产一区二区三区观看| 久久久久久久久久久一区 | 中文精品一区二区三区| 亚洲欧洲99久久| 黑人巨大精品欧美黑白配亚洲| 久久不射2019中文字幕| 欧美国产先锋| 亚洲桃色在线一区| 国产午夜精品理论片a级探花| 久久精品主播| 亚洲精品欧美一区二区三区| 亚洲欧美日韩一区二区三区在线 | 欧美电影美腿模特1979在线看| 亚洲人成啪啪网站| 欧美一区日韩一区| 1024亚洲| 国产精品美女在线| 久久中文久久字幕| 一区二区三区 在线观看视| 久久免费一区| 一区二区三区高清视频在线观看| 国产精品亚洲人在线观看| 老司机午夜精品视频在线观看| 日韩一区二区高清| 免费成人av在线看| 午夜精品一区二区三区在线播放| 在线播放一区| 国产精品www色诱视频| 老司机成人网| 午夜一区在线| 99re6这里只有精品| 免费观看日韩| 欧美一区影院| 一区二区三区日韩精品| 精品不卡一区| 国产精品亚洲综合天堂夜夜| 欧美福利在线观看| 久久久xxx| 亚洲一区二区三区免费观看 | 欧美在线视频在线播放完整版免费观看 | 国产亚洲成人一区| 欧美日韩一二三四五区| 免费日韩视频| 久久精品免费电影| 亚洲午夜精品久久| 亚洲免费激情| 91久久国产综合久久蜜月精品| 久久人人爽爽爽人久久久| 亚洲欧美中文在线视频| 亚洲特级毛片| 99国产精品99久久久久久粉嫩| 亚洲国产精品黑人久久久| 黑人一区二区| 韩国一区二区三区在线观看| 国产精品一二一区| 国产精品热久久久久夜色精品三区| 欧美激情一区二区三区成人| 农村妇女精品| 模特精品在线| 欧美成人午夜免费视在线看片 | 亚洲精品五月天| 亚洲黄一区二区| 亚洲精品免费在线| 亚洲欧洲精品一区| 亚洲欧洲精品一区二区精品久久久| 欧美电影打屁股sp| 欧美激情第三页| 亚洲高清自拍| 亚洲免费观看视频| 一区二区国产日产| 中文在线不卡| 亚洲一区影院| 久久高清福利视频| 久久久久99| 欧美高清视频一区二区| 欧美日韩美女在线观看| 欧美日韩一区在线播放| 国产精品欧美精品| 韩日视频一区| 亚洲精品在线免费观看视频| 夜夜夜久久久| 性做久久久久久免费观看欧美| 久久高清一区| 欧美激情中文不卡| 夜夜嗨av一区二区三区中文字幕 | 欧美成人中文字幕在线| 亚洲黄色在线看| 亚洲视频福利| 久久久久国产精品厨房| 欧美v日韩v国产v| 欧美视频在线播放| 国产一区二区三区日韩| 亚洲精品久久久久久下一站| 亚洲综合首页| 免费国产自线拍一欧美视频| 亚洲精品一区二区三区婷婷月 | 日韩一级欧洲| 久久国产精品久久精品国产| 欧美国产成人在线| 国产女精品视频网站免费 | 国产精品高潮呻吟| 在线免费观看日本一区| 亚洲亚洲精品三区日韩精品在线视频| 午夜精品在线| 亚洲国产裸拍裸体视频在线观看乱了中文 | 精品福利免费观看| 一区二区三区欧美| 久久字幕精品一区| 亚洲神马久久| 欧美wwwwww| 国产一区二区精品久久91| aa级大片欧美| 免费一区视频| 香蕉视频成人在线观看| 欧美日韩国产精品| 在线成人av.com| 欧美一区二区黄| 99在线观看免费视频精品观看| 久久久久久电影| 国产日韩欧美在线看| 一区二区欧美视频| 亚洲国产精品成人va在线观看| 亚洲欧美日韩国产综合| 欧美图区在线视频| 99热在这里有精品免费|