C++中的關鍵概念:名字尋找與繼承

來源:互聯網
上載者:User
關鍵概念:名字尋找與繼承

理解 C++ 中繼承層次的關鍵在於理解如何確定函數調用。確定函數調用遵循以下四個步驟:

1)  首先確定進行函數調用的對象、引用或指標的靜態類型。

2)  在該類中尋找函數,如果找不到,就在直接基類中尋找,如此循著類的繼承鏈往上找,直到找到該函數或者尋找完最後一個類。如果不能在類或其相關基類中找到該名字,則調用是錯誤的。

3)  一旦找到了該名字,就進行常規類型檢查,查看如果給定找到的定義,該函數調用是否合法。

4)  假定函數調用合法,編譯器就產生代碼。如果函數是虛函數且通過引用或指標調用,則編譯器產生代碼以確定根據對象的動態類型運行哪個函數版本,否則,編譯器產生代碼直接調用函數。

class A{protected:int m_data;public:A(int data=0){m_data = data;}int GetData(){return doGetData();}virtual int doGetData(){return m_data;}};class B: public A{protected:int m_data;public:B(int data = 1){m_data = data;}int doGetData(){return m_data;}};class C: public B{protected:int m_data;public:C(int data=2){m_data = data;}};class Base{public:virtual int fun(){cout << "base: virtual int fun()" << endl;return 0;}};class D1 : public Base{public:int fun(int){cout << "D1: int fun(int)" << endl;return 0;}int myfun(int, int){cout << "Two int" << endl;return 0;}};class D2 : public D1{public:int fun(int){cout << "D2: int fun(int)" << endl;return 0;}int fun(){cout << "D2: int fun()" << endl;return 0;}int myfun(int, int, int){cout << "Three int" << endl;return 0;}};int main(){C c(10);cout << c.GetData() << endl;cout << c.A::GetData() << endl;cout << c.B::GetData() << endl;cout << c.C::GetData() << endl;cout << c.doGetData() << endl;cout << c.A::doGetData() << endl;cout << c.B::doGetData() << endl;cout << c.C::doGetData() << endl;D2 d2;//d2.myfun(2,2); //“D2::myfun”: 函數不接受 2 個參數。同一個類中定義的函數才可以重載,繼承來的不行。d2.myfun(2,2,2);getchar();return 0;}

運行結果:

說明:

     1)成員函數的重載只能發生在同一個類中所定義的若干函數。不能對從父類繼承過來的函數進行重載。因為用子類對象調用“重載函數”的時候,名字尋找規則首先在子類中進行,結果找到了具有這個名字的函數,不會再向父類繼續尋找,所以也談不上重載。(注釋處說明了這個問題)

     2)因為D1定義了一個 int fun(int) ,它屏蔽了基類的虛函數 virtual int fun()。從Base繼承的虛函數不能通過D1對象(或D1的引用或指標)調用,因為該虛函數被屏蔽了,名字尋找規則決定了其在D1中找到了名為fun函數,不會繼續向上尋找。

     3)對於前面11111011的輸出,只解釋第一個,後面類似:cout << c.GetData() << endl;

本來是要調用C類的GetData(),C中未定義,故調用B中的,但是B中也未定義,故調用A中的GetData(),因為A中的doGetData()是虛函數,所以調用B類中的doGetData(),而B類中的doGetData()返回B::m_data,所以輸出1。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.