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