C++ 的虛擬函式可以有預設引數嗎?


是的,C++ 虛擬函式可以有預設引數。

示例程式碼

 線上演示

#include<iostream>
using namespace std;
class B {
   public:
      virtual void s(int a = 0) {
         cout<<" In Base \n";
      }
};

class D: public B {
   public:
      virtual void s(int a) {
         cout<<"In Derived, a="<<a;
      }
};

int main(void) {
   D d; // An object of class D
   B *b = &d;// A pointer of type B* pointing to d
   b->s();// prints"D::s() called"
   return 0;
}

輸出

In Derived, a=0

在此輸出中,我們可以觀察到,呼叫的是派生類的 s(),並且使用了基類的 s() 的預設值。

預設引數不會參與函式的簽名。因此,基類和派生類中 s() 的簽名被認為是相同的,因此基類的 s() 被覆蓋。預設值在編譯時使用。當編譯器檢查函式呼叫中缺少引數時,它將替換給定的預設值。因此,在上述程式中,x 的值在編譯時替換,並在執行時呼叫派生類的 s()。a 的值在編譯時替換,並在執行時呼叫派生類的 s()。

更新於: 30-07-2019

736 次瀏覽

開啟你的職業生涯

完成課程以獲得認證

開始學習
廣告
© . All rights reserved.