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

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>
            国产日本欧美视频| 久久成年人视频| 国内精品福利| 亚洲综合久久久久| 亚洲一区二区三区在线看| 浪潮色综合久久天堂| 久久精品盗摄| 欧美日韩在线一区| 亚洲精品免费一二三区| 亚洲高清资源| 久久中文精品| 久久综合五月| 一区二区在线观看av| 久久久国产精彩视频美女艺术照福利| 欧美伊久线香蕉线新在线| 国产精品蜜臀在线观看| 亚洲欧美另类久久久精品2019| 午夜欧美大尺度福利影院在线看| 欧美性色综合| 亚洲欧美日韩区| 久久aⅴ乱码一区二区三区| 国产精品午夜在线| 欧美一区二区三区免费观看| 久久亚洲春色中文字幕| 激情成人综合| 欧美成人视屏| 99视频一区二区| 午夜一区不卡| 国产主播一区二区三区| 麻豆精品视频在线观看| 亚洲国产视频a| 亚洲午夜精品久久| 国产日韩精品一区观看| 久久久久久成人| 亚洲国产欧美一区二区三区久久 | 国产综合一区二区| 看欧美日韩国产| 亚洲国产精品久久| 亚洲欧美日韩国产另类专区| 国产午夜精品福利 | 免费观看在线综合色| 亚洲日韩欧美一区二区在线| 欧美午夜精品久久久久久浪潮| 午夜精品久久久久久久久| 欧美不卡高清| 亚洲一区网站| 在线成人av网站| 欧美日韩第一页| 欧美一区二区三区四区夜夜大片| 欧美激情欧美激情在线五月| 亚洲天堂av在线免费观看| 国产一区香蕉久久| 欧美日本亚洲韩国国产| 亚洲专区一区| 欧美激情 亚洲a∨综合| 国产精品久久国产三级国电话系列| 亚洲午夜免费福利视频| 欧美 日韩 国产 一区| 一区二区三区国产盗摄| 国产一区在线观看视频| 欧美高清在线视频| 亚洲欧美一区二区三区久久| 最新日韩在线视频| 国产精品毛片高清在线完整版| 亚洲自拍偷拍色片视频| 欧美va日韩va| 亚洲欧美日韩成人高清在线一区| 亚洲第一福利在线观看| 国产精品卡一卡二| 欧美高清不卡| 久久久精品一区| 亚洲欧美日韩国产一区二区| 日韩视频免费观看| 亚洲国产精品123| 久久综合伊人77777| 久久不射中文字幕| 亚洲欧美日韩一区| 国产精品99久久久久久有的能看| 亚洲精品网站在线播放gif| 影音先锋久久| 韩国一区二区三区在线观看 | 欧美日韩在线一区| 欧美风情在线观看| 欧美aⅴ一区二区三区视频| 久久久久久久久蜜桃| 欧美在线欧美在线| 欧美一级黄色录像| 羞羞视频在线观看欧美| 亚洲一区二区在线免费观看| 在线一区观看| 亚洲网址在线| 亚洲素人在线| 亚洲视频在线观看一区| 91久久精品国产91久久性色| 欧美成人a视频| 在线观看日韩www视频免费| 国产一区二区av| 国产精品高潮呻吟视频| 欧美精品一二三| 欧美日韩精品一区二区天天拍小说 | 欧美午夜免费| 免费精品视频| 亚洲影视九九影院在线观看| 亚洲一区二区免费看| 亚洲国产欧美一区| 农夫在线精品视频免费观看| 久久精品国产亚洲一区二区三区| 亚洲婷婷综合色高清在线| 亚洲激情午夜| 国产精品亚洲第一区在线暖暖韩国| 国产精品日本精品| 欧美少妇一区| 欧美日韩三级| 欧美精品自拍偷拍动漫精品| 免费成人毛片| 久久综合久久综合久久综合| 午夜精品久久久久久久蜜桃app| 亚洲无线视频| 亚洲天堂成人| 亚洲视频一二| 在线亚洲成人| 亚洲午夜久久久久久久久电影院| 欧美h视频在线| 亚洲理论在线| 9色精品在线| 在线视频欧美日韩精品| 艳妇臀荡乳欲伦亚洲一区| 午夜亚洲视频| 亚洲美女在线视频| 亚洲欧美中文在线视频| 亚洲一区视频在线| 欧美亚洲专区| 久久精品国产免费看久久精品| 欧美自拍偷拍午夜视频| 亚洲免费在线视频一区 二区| 久久久无码精品亚洲日韩按摩| 久久精品国产一区二区三区| 久久精品导航| 欧美黄在线观看| 亚洲精品社区| 亚洲一区日本| 欧美+日本+国产+在线a∨观看| 欧美精品亚洲精品| 国产精品精品视频| 国产亚洲成av人在线观看导航| 好看的亚洲午夜视频在线| 亚洲国产精品久久久久婷婷884| 日韩小视频在线观看专区| 亚洲视频图片小说| 亚洲欧美影院| 美女视频黄免费的久久| 亚洲三级色网| 午夜精品www| 欧美久久久久| 国产女优一区| 亚洲国产日韩欧美| 亚洲一区久久| 久久一综合视频| 久久天天狠狠| 亚洲精品国产无天堂网2021| 亚洲专区欧美专区| 你懂的国产精品永久在线| 国产精品第一区| 伊大人香蕉综合8在线视| 红桃视频欧美| 亚洲日韩视频| 久久久久久成人| 亚洲精品国产精品乱码不99按摩| 亚洲在线视频网站| 老司机免费视频久久| 国产精品乱码一区二区三区 | 欧美日韩激情小视频| 国产亚洲精品7777| 亚洲欧美日韩精品久久奇米色影视| 久久青草久久| 日韩午夜精品视频| 久久久水蜜桃| 国产精品午夜视频| 亚洲欧美日韩一区二区三区在线| 久久综合国产精品| 亚洲一本大道在线| 欧美不卡视频一区| 国产午夜精品美女毛片视频| 日韩亚洲欧美一区二区三区| 久久免费精品视频| 亚洲一区二区三区免费在线观看| 99视频一区二区三区| 欧美一区二区免费| 欧美午夜大胆人体| 日韩视频欧美视频| 蜜桃av综合| 性xx色xx综合久久久xx| 欧美视频三区在线播放| 亚洲精品久久久久久下一站| 久久亚洲精品视频| 欧美一级久久久久久久大片| 国产精品劲爆视频| 欧美中文在线免费| 亚洲一区二区欧美日韩| 欧美日韩卡一卡二|