日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

绝不重新定义继承而来的缺省值参数

發布時間:2024/4/11 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 绝不重新定义继承而来的缺省值参数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

絕不重新定義繼承而來的缺省值參數

文章目錄

  • 絕不重新定義繼承而來的缺省值參數
    • 一、問題引入
    • 二、結論

一、問題引入

  • 在C++中,只能繼承兩種函數:虛(virtual)函數和非虛(non-virtual)函數。
  • 而重新定義一個繼承而來的帶有缺省參數值的虛(virtual)函數永遠是錯誤的
  • 虛(virtual)函數是動態綁定
  • 缺省參數值是靜態綁定
class Shape { public:enum ShapeColor{Red, Green, Blue};virtual void draw(ShapeColor color = Red) const = 0;... };class Rectangle: public Shape { public:virtual void draw(ShapeColor color = Green) const;... };class Circle: public Shape { public:virtual void draw(ShapeColor color) const;... };

以上代碼有個問題,如果你用下面的調用方式:

Shape *ps; Shape *pc = new Circle; Shape *pr = new Rectangle;pc->draw(Shape::Red);    //Circle::draw(Shape::Red); pr->draw(Shape::Red);    //Rectangle::draw(Shape::Red);pr->draw();          //Rectangle::(Shape::Red)!!!!
  • 我們會發現,pr的動態類型是Rectangle*, 所以調用的是Rectangle的virtual函數,Rectangle::draw的缺省參數應該是GREEN
  • 但是,由于pr的靜態類型是Shape*,所以此調用的缺省參數值來自Shape而不是Rectangle。
  • C++之所以這么做,是考慮到運行時效率的問題。如果缺省參數值是動態綁定,編譯器就必須在運行期為虛函數決定適當的缺省值。這比目前實行的“在編譯器決定”機制更慢更復雜。

二、結論

  • 絕對不要重新定義一個繼承而來的缺省參數值,這些參數值都是靜態的,而虛函數卻是動態的。
#include <iostream> using namespace std; class A { public: virtual void Print(int a = 999) { cout<<a<<endl; } }; class B : public A { public: virtual void Print(int a = 666) { cout<<a<<endl; } }; void Test(A& a) { a.Print(); } int main() { B b; Test(b); return 0; }
  • 這段代碼的輸出結果是999而非666,也就充分驗證我們的結論

總結

以上是生活随笔為你收集整理的绝不重新定义继承而来的缺省值参数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。