2012-12-11 177 views
1

爲什麼不打印'雙倍'?尋找詳細的解釋。謝謝你的時間!虛擬函數,函數重載,繼承

#include<iostream.h> 
using namespace std; 

class B{ 
public: 
virtual int ft(int i) { cout <<"int"; return 0;} 
}; 
class D: public B { 
public: 
    double ft(double i){cout << "doub"; return 0.0;} 
    int ft(int i) { cout <<"intdoub"; return 0;} 
}; 

int main(){ 
B *pB = new D; 
pB->ft(2.3); 
} 

O/P是 'intdoub'

+0

是什麼打印?什麼? 'cout'在您的應用程序中工作? –

+0

什麼是打印? – Tomek

+0

什麼*它打印?另外,爲什麼你使用真正舊的'iostream.h'而不是'iostream'? – chris

回答

6

可變pBB*類型的,並且不知道該函數double D::ft(double),僅virtual int B::ft(int)double2.3int的轉換會自動發生,但您應該收到編譯器警告。

嘗試:

dynamic_cast<D*>(pB)->ft(2.3); 
dynamic_cast<D*>(pB)->B::ft(2.3); 
+0

這是正確的答案。 – Tomek

+0

@ user946850「pB是B類型的,並且不知道函數」是否因爲對象切片? – sree

+0

答案是正確的。我想補充說的是,該程序將輸出'intdoub'。 – npclaudiu