簡體   English   中英

虛函數輸出?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM