2015-04-08 210 views
-1

在下面的代碼中,我們有兩個類,每個類中有兩個方法:一個是虛擬的,另一個是非虛​​擬的。我不明白當我運行這個代碼時會發生什麼。在哪種情況下以及哪個功能(1,2,3)系統使用虛擬或非虛擬功能?對於所有情況,我在評論中寫下了代碼運行時獲得的內容。我有點混亂...在此先感謝相同類中的虛擬方法vs非虛擬方法

class cFather { 
    public: 
      void print()  { cout<<」 1) cFather\n」;} 
    virtual void print() const { cout<<」 2) cFather\n」}; 
}; 

class cSon : public cFather { 
    public: 
    virtual void print()  { cout<<」 3) der\n」; } 
    void print() const { cout<<」 4) der\n」; } 
}; 

void function1 (const cFather& o) 
{ 
    o.print(); 
} 

void function2 (const cFather o) 
{ 
    o.print(); 
} 

void function3(cFather o) 
{ 
    o.print(); 
} 

A)

void main () 
{ cFather o; 
function3(o); } 
// 1) CFather 

B)

void main () 
{ cSon t; 
function1(t); } 
// 4) der 

C)

void main () 
{ cFather * o; 
cSon t; 
o = &t; 
o->print(); } 
// 1) cFather 

d)

void main () 
{ cFather o; 
function2(o); } 
// 2) cFather 
+2

這不是「唯一區別」;一個是const,另一個不是。 –

+0

哪種行爲,具體來說,你不明白? –

+0

你是對的我修改了它! – Laura

回答

1

如果您通過指針或引用調用虛擬方法,則在運行時動態解析虛擬方法僅限於。在所有其他情況下,要調用的函數將在編譯時靜態解析。

您應該瞭解虛擬方法的工作原理。簡單地說,編譯器在你的對象中存儲一個指針,該指針用於該類的每個虛擬方法。當通過指針或引用調用虛擬方法時,將調用對象中相應指針指向的函數。所以,呼叫將在運行時解決

因此,只有function1可以動態調用正確的方法,因爲它是唯一一個通過引用而不是按值傳遞參數的方法。

情況「D」不是在運行時解決方法必須被調用;它只是選擇第二種方法,因爲它是在const對象上調用的。即使它不是虛擬的,它也會表現相同。

+0

我知道,但爲什麼在案例D中,系統使用虛擬的例子呢? – Laura

+0

@Laura:它不使用虛擬的,因爲它是'虛擬'的,但是因爲它是'const'。 –

+0

感謝您的回覆......您對我的幫助很大 – Laura