[英]Virtual function output?
我只是在做一些事情,並編寫了這個程序。 我得到以下輸出。 我知道函數解析發生在運行時,而變量的綁定發生在編譯時,但是我不明白的是我得到的第一個輸出( 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
對於第一個輸出, this->n
指的是成員變量B::n
,您無需初始化-可以打印任何內容。
對於第二個, n
表示局部變量n
,您可以使用function參數進行初始化。 由於默認參數是由調用方提供的,並且您是通過對A
的引用來調用函數A
,因此您將獲得A::Fun1
指定的默認值,而不是B::Fun1
指定的默認值。 如果要調用b.Fun1()
,它將顯示B::Fun1() 20
。
對於第三個對象,您已經“切片”了B
對象,給出了類型為A
的對象,因此調用了A::Fun1
。
您的成員變量B::n
沒有在任何地方初始化。 您很幸運,您獲得了一個合理的價值,可能什么都沒有。
您的B :: n未初始化,我在運行代碼時得到了它。
B :: Fun1()-858993460 B :: Fun1()10 A :: Fun1()10
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.