2012-02-16 85 views
0

我只是在做一些東西,並寫了這個程序。我得到了以下輸出。我知道函數解析發生在運行時,而變量綁定發生在編譯時,但我不明白的是我得到的第一個輸出(this->n)。任何人都可以向我解釋這個嗎?虛擬功能輸出?

# include <iostream> 
    # include <stdio.h> 
    # include <conio.h> 

    using namespace std; 

    class A 
    { 
     int n;  
     public: 
     virtual void Fun1(int no=10) 
     { 
     int n=no;   
     cout<<"A::Fun1() "<<n <<"\n"; 
     } 
    }; 

    class B :public A 
    { 
    int n;  
    public: 
    virtual void Fun1(int no=20) 
    { 
     int n=no;   
     cout<<"B::Fun1() " << this->n << "\n"; // WHY SO ? gives B::Fun1() 40 
     cout<<"B::Fun1() " << n << "\n"; 
    } 
    }; 

    int main() 
    { 
    B b; 
    A &a =b; 
    a.Fun1(); 
    A a1=b; 
    a1.Fun1(); 
    getch(); 
    return 0; 
    } 

我得到的輸出是

B::Fun1() 40 
    B::Fun1() 10 
    A::Fun1() 10  
+5

你的類的數據成員是未初始化的;你可以從他們那裏獲得價值。 – ildjarn 2012-02-16 16:52:04

+0

您正在用'A a1 = b;'切片對象。這是預期的行爲。 – 2012-02-16 16:57:26

回答

5

對於第一個輸出,this->n指成員變量B::n,你永遠不會初始化 - 這可以打印任何東西。

對於第二個,n指的是用函數參數初始化的局部變量n。由於調用者提供了默認參數,並且您通過對A的引用調用該函數,所以您將獲得A::Fun1中指定的默認值,而不是B::Fun1中指定的值。如果您打電話給b.Fun1(),那麼它會打印B::Fun1() 20

對於第三個,您已將「B」對象「切片」,給出A類型的對象,因此調用A::Fun1

3

您的成員變量B::n未在任何地方初始化。你很幸運,你有一個合理的價值,它可能是任何東西。

0

你的B :: n是未初始化的當我運行代碼時得到了這個。

B :: FUN1()-858993460 B :: FUN1()10 A :: FUN1()10