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

山寨:不是最好的,是最適合我們的!歡迎體驗山寨 中文版MSDN

Blog @ Blog

當華美的葉片落盡,生命的脈絡才歷歷可見。 -- 聶魯達

常用鏈接

統計

積分與排名

BBS

Blog

Web

最新評論

C++中的虛函數(一)

轉自:http://www.vckbase.com/document/viewdoc/?id=950

C++中的虛函數(一)


作者:aber




    雖然很難找到一本不討論多態性的C++書籍或雜志,但是,大多數這類討論使多態性和C++虛函數的使用看起來很難。我打算在這篇文章中通過從幾個方面和結合一些例子使讀者理解在C++中的虛函數實現技術。說明一點,寫這篇文章只是想和大家交流學習經驗因為本人學識淺薄,難免有一些錯誤和不足,希望大家批評和指正,在此深表感謝!

一、 基本概念
    首先,C++通過虛函數實現多態."無論發送消息的對象屬于什么類,它們均發送具有同一形式的消息,對消息的處理方式可能隨接手消息的對象而變"的處理方式被稱為多態性。"在某個基類上建立起來的類的層次構造中,可以對任何一個派生類的對象中的同名過程進行調用,而被調用的過程提供的處理可以隨其所屬的類而變。"虛函數首先是一種成員函數,它可以在該類的派生類中被重新定義并被賦予另外一種處理功能。

二、 虛函數的定義與派生類中的重定義

class 類名{
public:
virtual 成員函數說明;
}
class 類名:基類名{
public:
virtual 成員函數說明;
}
三、 虛函數在內存中的結構

1.我們先看一個例子:
#include "iostream.h"
#include "string.h"
class A {
public:
virtual void fun0() { cout << "A::fun0" << endl; }
};
int main(int argc, char* argv[])
{
A  a;
cout << "Size of A = " << sizeof(a) << endl;
return 0;
}      
結果如下:Size of A = 4

2.如果再添加一個虛函數:virtual void fun1() { cout << "A::fun" << endl;}
得到相同的結果。如果去掉函數前面的virtual修飾符
class A {
public:
void fun0() { cout << "A::fun0" << endl; }
};
int main(int argc, char* argv[])
{
A  a;
cout << "Size of A = " << sizeof(a) << endl;
return 0;
}      
結果如下:Size of A = 1
 
3.在看下面的結果:
class A {
public:
virtual void fun0() { cout << "A::fun0" << endl; }
int a;
int b;
};
int main(int argc, char* argv[])
{
A  a;
cout << "Size of A = " << sizeof(a) << endl;
return 0;
}      
結果如下:Size of A = 12

其實虛函數在內存中結構是這樣的:


圖一

    在window2000下指針在內存中占4個字節,虛函數在一個虛函數表(VTABLE)中保存函數地址。在看下面例子。
class A {
public:
virtual void fun0() { cout << "A::fun0" << endl; }
virtual void fun1() { cout << "A::fun1" << endl; }
int a;
int b;
};
int main(int argc, char* argv[])
{
A  a;
cout << "Size of A = " << sizeof(a) << endl;
return 0;
}
結果如下:結果如下:
Size of A = 4

    虛函數的內存結構如下,你也可以通過函數指針,先找到虛函數表(VTABLE),然后訪問每個函數地址來驗證這種結構,在國外網站作者是:Zeeshan Amjad寫的"ATL on the Hood中有詳細介紹"


圖二

4.我們再來看看繼承中虛函數的內存結構,先看下面的例子
class A {
public:
virtual void f() { }
};
class B {
public:
virtual void f() { }
};
class C {
public:
virtual void f() { }
};
class Drive : public A, public B, public C {
};
int main() {
Drive d;
cout << "Size is = " << sizeof(d) << endl;
return 0;
}      
結果如下:Size is = 12 ,相信大家一看下面的結構圖就會很清楚,


圖三

5.我們再來看看用虛函數實現多態性,先看個例子:
class A {
public:
virtual void f() { cout << "A::f" << endl; }
};
class B :public A{
public:
virtual void f() { cout << "B::f" << endl;}
};
class C :public A {
public:
virtual void f() { cout << "C::f" << endl;}
};
class Drive : public C {
public:
virtual void f() { cout << "D::f" << endl;}
};
int main(int argc, char* argv[])
{
A a;
B b;
C c;
Drive d;
a.f();
b.f();
c.f();
d.f();
return 0;
}
結果:A::f
B::f
C::f
D::f
不用解釋,相信大家一看就明白什么道理!注意:多態不是函數重載

6.用虛函數實現動態連接在編譯期間,C++編譯器根據程序傳遞給函數的參數或者函數返回類型來決定程序使用那個函數,然后編譯器用正確的的函數替換每次啟動。這種基于編譯器的替換被稱為靜態連接,他們在程序運行之前執行。另一方面,當程序執行多態性時,替換是在程序執行期進行的,這種運行期間替換被稱為動態連接。如下例子:
class A{
public:
virtual void f(){cout << "A::f" << endl;};
};
class B:public A{
public:
virtual void f(){cout << "B::f" << endl;};
};
class C:public A{
public:
virtual void f(){cout << "C::f" << endl;};
};
void test(A *a){
a->f();
};
int main(int argc, char* argv[])
{
B *b=new B;
C *c=new C;
char choice;
do{
cout<<"type  B for class B,C for class C:"<<endl;
cin>>choice;
if(choice==''b'')
test(b);
else if(choice==''c'')
test(c);
}while(1);
cout<<endl<<endl;
return 0;
}
    在上面的例子中,如果把類A,B,C中的virtual修飾符去掉,看看打印的結果,然后再看下面一個例子想想兩者的聯系。如果把B和C中的virtual修飾符去掉,又會怎樣,結果和沒有去掉一樣。

7.在基類中調用繼承類的函數(如果此函數是虛函數才能如此)還是先看例子:
class A {
public:
virtual void fun() {
cout << "A::fun" << endl;
}
void show() {
fun();
}
};
class B : public A {
public:
virtual void fun() {
cout << "B::fun" << endl;
}
};
int main() {
A a;
a.show();
return 0;
}      
打印結果:A::fun

    在6中的例子中,test(A *a)其實有一個繼承類指針向基類指針隱式轉化的過程。可以看出利用虛函數我們可以在基類調用繼承類函數。但如果不是虛函數,繼承類指針轉化為基類指針后只可以調用基類函數。反之,如果基類指針向繼承類指針轉化的情況怎樣,這只能進行顯示轉化,轉化后的繼承類指針可以調用基類和繼承類指針。如下例子:
class A {
public:
void fun() {
cout << "A::fun" << endl;
}
};
class B : public A {
public:
void fun() {
cout << "B::fun" << endl;
}
void fun0() {
cout << "B::fun0" << endl;
}
};
int main() {
A *a=new A;
B *b=new B;
A *pa;
B *pb;
pb=static_cast<B *>(a); //基類指針向繼承類指針進行顯示轉化
pb->fun0();
pb->fun();
return 0;
}  
參考資料:
1.科學出版社 《C++程序設計》
2.Zeeshan Amjad 《ATL on the Hood》

posted on 2008-04-10 17:55 isabc 閱讀(232) 評論(0)  編輯 收藏 引用

廣告信息(免費廣告聯系)

中文版MSDN:
歡迎體驗

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美激情一区二区| 久久精品日韩| 久久精视频免费在线久久完整在线看| 99精品欧美一区| 鲁鲁狠狠狠7777一区二区| 午夜精品理论片| 欧美一区二区高清在线观看| 欧美一区不卡| 久久综合中文字幕| 欧美第十八页| 国产精品美女久久久久久免费| 国产精品网曝门| 在线日韩电影| 欧美国产日韩一区二区| 欧美91精品| 一区二区三区色| 欧美一区二区精品| 美女精品网站| 国产精品成人一区二区三区夜夜夜| 欧美亚洲成人免费| 一区二区三区在线视频免费观看| 亚洲精品乱码视频| 久久精品91久久久久久再现| 欧美激情一区二区三区在线| 亚洲先锋成人| 免费影视亚洲| 亚洲一区精品在线| 免费久久久一本精品久久区| 国产精品欧美久久| 亚洲日本va午夜在线电影| 欧美一区二区三区四区视频| 亚洲福利电影| 亚洲精品美女| 久久亚洲精品伦理| 日韩午夜中文字幕| 久久亚洲私人国产精品va| 欧美性jizz18性欧美| 亚洲二区三区四区| 久久精品国内一区二区三区| 亚洲精品网址在线观看| 欧美在线综合视频| 国产精品久久久一区二区三区| 亚洲国产成人一区| 久久精品欧美| 小黄鸭精品密入口导航| 久久综合婷婷| 国内视频一区| 欧美专区第一页| 欧美日一区二区三区在线观看国产免| 久久精品二区| 亚洲永久免费精品| 欧美日韩国内| 亚洲剧情一区二区| 欧美高清在线视频| 久久五月天婷婷| 亚洲欧美日产图| 国产精品成人一区二区艾草| 99精品热视频| 亚洲精品欧美精品| 欧美精品一区三区| 一区二区日韩精品| 亚洲精品四区| 国产精品高精视频免费| 亚洲一区精品在线| 亚洲在线视频网站| 国产亚洲精品美女| 美女主播精品视频一二三四| 麻豆成人综合网| 亚洲人成久久| 亚洲免费成人| 国产精品午夜国产小视频| 欧美伊人久久久久久久久影院| 亚洲天堂成人在线视频| 国产精品日韩欧美综合| 亚洲欧美精品伊人久久| 亚洲欧美日韩区 | 欧美风情在线观看| 久久中文字幕导航| 亚洲精品欧美日韩| 日韩视频免费| 国产精品中文字幕欧美| 欧美在线视频导航| 久久综合伊人| 一本高清dvd不卡在线观看| 在线亚洲欧美专区二区| 国产一区二区三区视频在线观看| 美女图片一区二区| 欧美日韩国产区一| 久久九九精品| 久久精品在线播放| 亚洲欧洲一区| 午夜欧美大尺度福利影院在线看| 在线观看日韩| 夜夜嗨av一区二区三区| 国产综合av| 日韩午夜高潮| 亚洲成人在线视频播放| 一区二区久久| 在线播放日韩专区| 亚洲午夜精品久久久久久app| 一区二区三区在线观看国产| 亚洲美女黄网| 亚洲成人资源| 欧美一区二区在线播放| 中日韩高清电影网| 久久影视三级福利片| 亚洲伊人伊色伊影伊综合网| 久久久久在线| 亚洲久久成人| 亚洲激情在线观看| 免费看亚洲片| 国产精品素人视频| 亚洲日本免费| 亚洲国产99| 香蕉尹人综合在线观看| 亚洲丝袜av一区| 欧美激情乱人伦| 久久久水蜜桃av免费网站| 国产精品国产自产拍高清av王其| 欧美高清免费| 在线观看日韩一区| 欧美一区二区三区免费观看| 亚洲免费伊人电影在线观看av| 欧美 日韩 国产在线| 久久亚洲精品网站| 国产亚洲一区二区三区| 一区二区三区av| 在线一区二区三区四区| 蜜桃久久精品乱码一区二区| 麻豆国产精品va在线观看不卡 | 久久资源av| 久久精品视频在线观看| 国产毛片精品国产一区二区三区| 99热这里只有成人精品国产| 99精品视频免费| 欧美精品一区二区三区蜜桃| 亚洲福利视频免费观看| 亚洲茄子视频| 欧美人与禽性xxxxx杂性| 亚洲国产va精品久久久不卡综合| 欧美激情第4页| 日韩亚洲欧美一区二区三区| 99在线精品视频| 欧美视频在线观看免费| 在线视频你懂得一区二区三区| 亚洲一区视频在线观看视频| 国产精品极品美女粉嫩高清在线 | 亚洲卡通欧美制服中文| 免费观看成人www动漫视频| 欧美激情1区2区| 中文日韩在线| 国产精品伊人日日| 久久精品一区| 亚洲国内自拍| 亚洲综合精品四区| 国产一区二区三区的电影| 久久精品天堂| 亚洲区一区二| 欧美一区午夜视频在线观看| 国内精品视频在线播放| 欧美大片在线看| 亚洲一区二区高清| 久久午夜影视| 亚洲视频axxx| 精品成人久久| 欧美日韩精品免费在线观看视频| 亚洲图色在线| 欧美成人精品一区二区三区| 夜夜嗨av色综合久久久综合网| 国产精品自拍三区| 欧美福利视频| 91久久精品美女| 国产精品亚洲视频| 久久av资源网站| 91久久在线播放| 午夜国产精品视频| 亚洲高清123| 国产精品精品视频| 久久久综合香蕉尹人综合网| 日韩视频在线观看免费| 久久久久久久久久久久久久一区 | 久久成人一区| 亚洲精品乱码久久久久久日本蜜臀 | 日韩视频精品在线| 久久三级视频| 午夜免费在线观看精品视频| 亚洲日产国产精品| 国产字幕视频一区二区| 国产精品久久久久三级| 欧美高清在线一区二区| 久久九九免费| 午夜精品久久久久久久99水蜜桃 | 亚洲一区免费看| 亚洲日本理论电影| 欧美大成色www永久网站婷| 欧美在线免费视频| 亚洲一区二区少妇| 99国产精品久久久久久久成人热| 你懂的视频欧美| 久久五月天婷婷|