我只是做了一些事情并编写了这个程序.我得到了以下输出.我知道函数解析在运行时发生,而变量的绑定发生在编译期间,但我无法理解的是我得到的第一个输出(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;
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是
B::Fun1() 40
B::Fun1() 10
A::Fun1() 10
Run Code Online (Sandbox Code Playgroud)
对于第一个输出,this->n指的是B::n您从不初始化的成员变量- 这可以打印任何内容.
对于第二个,n引用局部变量n,使用函数参数初始化该局部变量.由于默认参数由调用者提供,并且您通过引用调用该函数A,因此您将获得指定的默认值A::Fun1,而不是中的默认值B::Fun1.如果你打电话b.Fun1(),那么它会打印出来B::Fun1() 20.
对于第三个,你已经"切片"了B对象,给出了一个类型的对象A,因此调用了A::Fun1.