2013-02-18 113 views
10

我有子類和使用方法的問題。爲什麼不調用子類方法?

我創建類B的一個實例,並將其存儲爲指向A的指針。但是當我使用指針調用重載方法時,輸出是「A」而不是「B」。爲什麼?

這在其他語言的作品,我做錯了什麼?

#include <iostream> 
using namespace std; 

class A { 
public: 
    void f() { 
     cout << "A"; 
    } 
}; 

class B : public A { 
public: 
    void f() { 
     cout << "B"; 
    } 
}; 

int main() { 
    A *a = new B(); 
    a->f(); 
    return 0; 
} 
+3

聲明的'F()'方法是虛擬的。用於在運行時延遲響應。否則靜態binging – 2013-02-18 15:09:38

+0

是啊,因爲它不是虛擬的 – 2013-02-18 15:11:43

回答

21

f()需求:

class A { 
public: 
    virtual void f() { 
     cout << "A"; 
    } 
}; 

你已經有可能默認爲虛擬方法工作的其他語言,但C++不(不支付你不要什麼不使用:虛擬方法在調用它們時會產生間接性,這意味着它們比正常方法調用稍慢)。

通過添加virtual,結合將被推遲到運行時(稱爲dynamic binding),並且f()函數調用將在類型的值的決定。

因爲你還沒有聲明的函數f()虛擬,結合是靜態的(在編譯時),並且將使用類型的變量(但不是值),以確定哪些f()打電話。所以在你現在的代碼表中a->f();調用A類的f(),因爲a是指向A類的指針。

+2

+1爲好的解釋:) – LihO 2013-02-18 15:15:04

+1

@GrijeshChauhan謝謝你的額外精度。 – syam 2013-02-18 15:35:01

6

爲了實現多態行爲,基類的方法必須是virtual

所以在class A您需要將void f()更改爲virtual void f()。要聲明在基類virtual

2

的函數必須聲明virtual能夠覆蓋它:

#include <iostream> 
using namespace std; 

class A { 
public: 
    virtual void f() {// Here you must define the virtual. 
     cout << "A"; 
    } 
}; 

class B : public A { 
public: 
    virtual void f() { //Here the "virtual" is optional, but a good practice 
     cout << "B"; 
    } 
}; 

int main() { 
    A *a = new B(); 
    a->f(); 
    return 0; 
} 
+1

當一個子類提供了一個已經在基類中定義的方法的實現時,它是[**方法覆蓋**](http://en.wikipedia.org/wiki/Method_overriding)不會超載。 – LihO 2013-02-18 15:24:22

相關問題