虚函数输出?

时间:2012-02-16 16:48:47

标签: c++

我只是做了一些事情并编写了这个程序。我得到了以下输出。我知道函数解析在运行时发生,而变量的绑定发生在编译期间,但我无法理解的是我得到的第一个输出(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    

3 个答案:

答案 0 :(得分:5)

对于第一个输出,this->n指的是成员变量B::n,它永远不会初始化 - 这可以打印任何内容。

对于第二个,n引用局部变量n,您使用函数参数初始化它。由于默认参数由调用者提供,并且您通过对A的引用调用该函数,因此您将获得A::Fun1中指定的默认值,而不是B::Fun1中的默认值。如果您拨打b.Fun1(),则会打印B::Fun1() 20

对于第三个,你已经“切片”了B个对象,给出了A类型的对象,因此调用了A::Fun1

答案 1 :(得分:3)

您的成员变量B::n未在任何地方初始化。你很幸运,你有一个合理的价值,它可能是任何东西。

答案 2 :(得分:0)

你的B :: n未初始化我在运行代码时得到了这个。

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