亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

虛函數默認參數行為

虛函數默認參數行為

C++
慕碼人2483693 2019-10-31 12:50:44
我對以下代碼有一個奇怪的情況。請幫助我弄清楚它。class B{       public:            B();            virtual void print(int data=10)            {                  cout << endl << "B--data=" << data;            }};class D:public B{       public:            D();            void print(int data=20)            {                  cout << endl << "D--data=" << data;            }};int main(){     B *bp = new D();     bp->print();return 0;}關于我期望的輸出[ D--data=20 ]但是實際上[ D--data=10 ]請幫忙。對于您來說,這似乎很明顯,但我不了解其內部機制。
查看完整描述

3 回答

?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

默認參數完全是編譯時功能。即在編譯時執行默認參數的替換,以代替缺少的參數。因此,顯然,成員函數的默認參數選擇不可能取決于對象的動態(即運行時)類型。它始終取決于對象的靜態(即編譯時)類型。


您在代碼示例中編寫的調用將立即被編譯器解釋為bp->print(10)與其他無關。


查看完整回答
反對 回復 2019-10-31
?
UYOU

TA貢獻1878條經驗 獲得超4個贊

標準說(8.3.6.10):


虛函數調用(10.3)在虛函數的聲明中使用默認參數,該聲明由表示對象的指針或引用的靜態類型確定。派生類中的重寫函數不會從其重寫的函數中獲取默認參數。


這意味著,由于您要print通過類型的指針進行調用B,因此它將使用默認參數B::print。


查看完整回答
反對 回復 2019-10-31
?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

通常,使用在特定范圍內可見的那些默認參數。您可以(但不應該)做一些時髦的事情:


#include <iostream>

void frob (int x) {

    std::cout << "frob(" << x << ")\n";

}


void frob (int = 0);

int main () {

    frob();                     // using 0

    {

        void frob (int x=5) ;

        frob();                 // using 5

    }

    {

        void frob (int x=-5) ;

        frob();                 // using -5

    }

}

在您的情況下,基類簽名是可見的。為了使用派生的默認參數,您必須通過指向派生類的指針顯式調用該函數,方法是這樣聲明或正確地對其進行強制轉換。


查看完整回答
反對 回復 2019-10-31
  • 3 回答
  • 0 關注
  • 470 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號