C++ virtual

來源:互聯網
上載者:User
/*功能,C++ virtual。面試常問道,建構函式和解構函式能否為虛函數,為什嗎?以前部落格裡寫過了,先不寫了。日期,2013年3月13日環境,ubuntu1204-gcc部落格,http://blog.csdn.net/shunqiziranhao007/article/details/8670238*/#include <iostream>using std::cout; using std::endl;#define P1 cout << endl;#define P2(X) cout << X;#define P3(X) cout << X << endl;class A{public:// 非虛函數void f();// virtual 的目的是啟用動態綁定。類成員預設為非虛函數,對非虛函數的調用在編// 譯時確定。為了指明函數為虛函數,在其傳回型別前面加上保留字 virtual。除了// 建構函式之外,任意非 static 成員函數都可以是虛函數。virtual只在類內部的// 成員函式宣告中出現,不能用在類定義體外部出現的函數定義上。// 定義為 virtual 的函數是基類期待衍生類別重新定義的,基類希望衍生類別繼承的// 函數不要定義為虛函數。virtual void f1();virtual void f2() { P3("A::f2()") }// 虛函數帶預設參數virtual void f3(int i=1) { P3("A::f3") }virtual void f4() { P3("A::f4") }};void A::f() { P3("A::f()") }// 不應該加virtual, 錯誤: ‘virtual’用在類聲明以外// virtual void A::f1() { P3("A::f1()") }void A::f1() { P3("A::f1()") }// 繼承和虛函數是一對好機油。class A1 : public A{public:void f() { P3("A1::f()") }// virtual 可加可不加,我覺得還是加下,更清楚些virtual void f1() { P3("A1::f1()") }virtual void f2(){// 想使用基類的f2,結果程式崩潰了。因為它並沒有調用基類的f2而是一直在調用自己。// f2();// 正確的用法A::f2();}// 預設參數類型與基類的不相同virtual void f3(double d=1) { P3("A1::f3") }// 屏蔽基類A的f4了,自己弄個非虛的f4void f4(int i) { P3("A1::f4(int)") }};class A2 : public A1{public:// 屏蔽直接基類A1的f4void f4(int i) { P3("A2::f4(int)") }// 再重定義間接基類A的f4void f4() { P3("A2::f4()") }};class B{public:B() { f(); }virtual void f() { P3("B::f()") }};class D : public B{public:D() { f(); }virtual void f() { P3("D::f()") }};int main(){A a;a.f();a.f1();a.f2();a.f3();P1A1 a1;a1.f();a1.f1();a1.f2();a1.f3();P1// 上面動態綁定沒形成,得通過基類的指標或引用來引發A *pa;pa = &a1;// 由於非虛函數,調用A的fpa->f();// 是虛函數,調用pa所指對象的f1即A1的f1pa->f1();P1// 強制調用基類的f1pa->A::f1();// 強制調用衍生類別的f, 錯誤: ‘A1’不是‘A’的基類,不可行啊!//x pa->A1::f();P1// 由於該虛函數的預設參數類型不同,f3將根據pa的類型決定,這裡將調用// A的f3.pa->f3();P1pa = &a;pa->f4();pa = &a1;pa->f4();A2 a2;pa = &a2;pa->f4();P1D d;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.