2016-10-02 91 views
0

我想了解C++中的虛函數的概念,我在線閱讀它,但我無法理解爲什麼下面的程序輸出是2而不是1?誰能解釋一下?C++中的虛函數的概念

Class A 
{ 
    int a; 
    public: 
     A() 
     { 
      a = 1; 
     } 
     virtual void show() 
     { 
      cout <<a; 
     } 
}; 

Class B: public A 
{ 
    int b; 
    public: 
     B() 
     { 
      b = 2; 
     } 
     virtual void show() 
     { 
      cout <<b; 
     } 
}; 

int main() 
{ 
    A *pA; 
    B oB; 
    pA = &oB; 
    pA->show(); 
    return 0; 
} 
+3

你能解釋爲什麼你所期望的結果是「1」? –

+0

你爲什麼認爲輸出結果應該是「1」? –

+1

繼續閱讀你的C++書籍,這完全解釋了這個概念。 –

回答

1

你實現多態性與壓倒一切的虛函數和指針: 在你的榜樣,你用pA的多態所以它是一個指向基類(A),但你,但你給它分配一個B類的對象,是A. 的子代,並且您將Show()聲明爲虛擬。

這是polymorphis的主要目標;這意味着我們不知道對象的類型基本指針指向直到運行時如主:

int main() 
{ 

    int choice; 
    cout << "1: A object 2: B object:\n\n"; 
    cin >> choice; 
    if(1 == choice) 
     pA = new A; // result will be 1 
    else 
     if(2 == choice) 
      pA = new B; // result will be 2 

    if(pA) 
     pA->show(); 
    delete pA; 
    pA = NULL; 

// B* pB = new A; // error: cannot convert from class A* to class B* because C++ is not contravariant 
    B* pB = new B; 
    pB->show(); // result: 2 

    delete pB; 
    pB = NULL; 

    return 0; 
} 
1

cppreference

虛擬函數是成員函數,其行爲可以在派生類被重寫。與非虛函數相反,即使沒有關於類的實際類型的編譯時信息,重寫的行爲也會被保留。 如果使用指針或對基類的引用處理派生類,則調用重寫的虛函數將調用派生類中定義的行爲。如果使用合格的名稱查找選擇功能受到抑制這種行爲(即,如果函數的名字出現在範圍解析操作的正確:因爲,你在B類中重寫show() :)

pA->show()將在類B中呼叫show()
希望這有助於