2012-02-16 87 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