我只是在做一些事情,然后写了这个程序。我得到了以下输出。我知道函数解析发生在运行时,而变量绑定发生在编译时,但我不能理解的是我得到的第一个输出(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 发布于 2012-02-17 00:54:05
对于第一个输出,this->n引用了成员变量B::n,您从未对其进行初始化-这可能会打印任何内容。
对于第二个,n引用局部变量n,您可以使用函数参数对其进行初始化。由于默认参数是由调用者提供的,并且您是通过对A的引用来调用函数的,因此您将获得在A::Fun1中指定的默认值,而不是在B::Fun1中指定的默认值。如果您调用b.Fun1(),那么它将打印B::Fun1() 20。
对于第三个,您对B对象进行了“分片”,给出了一个A类型的对象,因此调用了A::Fun1。
发布于 2012-02-17 00:54:30
您的成员变量B::n未在任何地方初始化。你很幸运,你得到了一个合理的值,它可以是任何东西。
发布于 2012-02-17 00:59:24
你的B::n是未初始化的,当我运行代码时会得到这个错误。
B::Fun1() -858993460 B::Fun1() 10 A::Fun1() 10
https://stackoverflow.com/questions/9315361
复制相似问题