亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C++箴言:謹慎使用私有繼承

2019-11-17 05:09:04
字體:
來源:轉載
供稿:網友

  在《C++箴言:確保公開繼續模擬“is-a”》一文中論述了 C++ 將 public inheritance(公有繼續)視為一個 is-a 關系。
當給定一個 hierarchy(繼續體系),其中有一個 class Student 從一個 class Person 公有繼續,當為一個函數調用的成功而有必要時,需要將 Students 隱式轉型為 Persons,它通過向編譯器展示來做到這一點。用 PRivate inheritance(私有繼續)代替 public inheritance(公有繼續)把這個例子的一部分重做一下是值得的:

  class Person { ... };
  class Student: private Person { ... }; // inheritance is now private

  void eat(const Person p); // anyone can eat

  void study(const Student s); // only students study

  Person p; // p is a Person
  Student s; // s is a Student

  eat(p); // fine, p is a Person

  eat(s); // error! a Student isn't a Person

  很明顯,private inheritance(私有繼續)不意味著 is-a。那么它意味著什么呢?

  “喂!”你說:“在我們得到它的含義之前,我們先看看它的行為。private inheritance(私有繼續)有怎樣的行為呢?”好吧,支配 private inheritance(私有繼續)的第一個規則你只能從動作中看到:與 public inheritance(公有繼續)對照,假如 classes(類)之間的 inheritance relationship(繼續關系)是 private(私有)的,編譯器通常不會將一個 derived class object(派生類對象)(諸如 Student)轉型為一個 base class object(基類對象)(諸如 Person)。這就是為什么為 object(對象)s 調用 eat 會失敗。第二個規則是從一個 private base class(私有基類)繼續的 members(成員)會成為 derived class(派生類)的 private members(私有成員),即使它們在 base class(基類)中是 protected(保護)的或 public(公有)的。

  行為不過如此。這就給我們帶來了含義。private inheritance(私有繼續)意味著 is-implemented-in-terms-of(是根據……實現的)。假如你使 class(類)D 從 class(類)B 私有繼續,你這樣做是因為你對于利用在 class(類)B 中才可用的某些特性感愛好,而不是因為在 types(類型)B 和 types(類型)D 的 objects(對象)之間有什么概念上的關系。同樣地,private inheritance(私有繼續)純粹是一種實現技術。(這也就是為什么你從一個 private base class(私有基類)繼續的每一件東西都在你的 class(類)中變成 private(私有)的原因:它全部都是實現的細節。)利用《接口繼續和實現繼續》中提出的條款,private inheritance(私有繼續)意味著只有 implementation(實現)應該被繼續;interface(接口)應該被忽略。

  假如 D 從 B 私有繼續,它就意味著 D objects are implemented in terms of B objects(D 對象是根據 B 對象實現的),沒有更多了。private inheritance(私有繼續)在 software design(軟件設計)期間沒有任何意義,只在 software implementation(軟件實現)期間才有。 private inheritance(私有繼續)意味著 is-implemented-in-terms-of(是根據……實現的)的事實有一點混亂,正如《通過composition模擬“has-a”》一文中所指出的 composition(復合)也有同樣的含義。你怎么預先在它們之間做出選擇呢?答案很簡單:只要你能就用 composition(復合),只有在絕對必要的時候才用 private inheritance(私有繼續)。什么時候是絕對必要呢?主要是當 protected members(保護成員)和/或 virtual functions(虛擬函數)摻和進來的時候,另外還有一種與空間相關的極端情況會使天平向 private inheritance(私有繼續)傾斜。我們稍后再來操心這種極端情況。

  究竟,它只是一種極端情況。 假設我們工作在一個包含 Widgets 的應用程序上,而且我們認為我們需要更好地理解 Widgets 是怎樣被使用的。例如,我們不僅要知道 Widget member functions(成員函數)被調用的頻度,還要知道 call ratios(調用率)隨著時間的流逝如何變化。帶有清楚的執行階段的程序在不同的執行階段可以有不同的行為側重。
例如,一個編譯器在解析階段對函數的使用與優化和代碼生成階段就有很大的不同。

  我們決定修改 Widget class 以持續跟蹤每一個 member function(成員函數)被調用了多少次。在運行時,我們可以周期性地檢查這一信息,與每一個 Widget 的這個值相伴的可能還有我們覺得有用的其它數據。為了進行這項工作,我們需要設立某種類型的 timer(計時器),以便在到達收集用法統計的時間時我們可以知道。

  盡可能復用已有代碼,而不是寫新的代碼,我在我的工具包中翻箱倒柜,而且滿足地找到下面這個 class(類):

  class Timer {
  public:
  eXPlicit Timer(int tickFrequency);
  virtual void onTick() const; // automatically called for each tick
  ...
  };

  這正是我們要找的:一個我們能夠根據我們的需要設定 tick 頻率的 Timer object,而在每次 tick 時,它調用一個 virtual function(虛擬函數)。我們可以重定義這個 virtual function(虛擬函數)以便讓它檢查 Widget 所在的當前狀態。很完美!

  在《C++箴言:確保公開繼續模擬“is-a”》一文中論述了 C++ 將 public inheritance(公有繼續)視為一個 is-a 關系。當給定一個 hierarchy(繼續體系),其中有一個 class Student 從一個 class Person 公有繼續,當為一個函數調用的成功而有必要時,需要將 Students 隱式轉型為 Persons,它通過向編譯器展示來做到這一點。用 private inheritance(私有繼續)代替 public inheritance(公有繼續)把這個例子的一部分重做一下是值得的:

  class Person { ... };
  class Student: private Person { ... }; // inheritance is now private

  void eat(const Person p); // anyone can eat

  void study(const Student s); // only students study

  Person p; // p is a Person
  Student s; // s is a Student

  eat(p); // fine, p is a Person

  eat(s); // error! a Student isn't a Person

  很明顯,private inheritance(私有繼續)不意味著 is-a。那么它意味著什么呢?

  “喂!”你說:“在我們得到它的含義之前,我們先看看它的行為。private inheritance(私有繼續)有怎樣的行為呢?”好吧,支配 private inheritance(私有繼續)的第一個規則你只能從動作中看到:與 public inheritance(公有繼續)對照,假如 classes(類)之間的 inheritance relationship(繼續關系)是 private(私有)的,編譯器通常不會將一個 derived class object(派生類對象)(諸如 Student)轉型為一個 base class object(基類對象)(諸如 Person)。這就是為什么為 object(對象)s 調用 eat 會失敗。第二個規則是從一個 private base class(私有基類)繼續的 members(成員)會成為 derived class(派生類)的 private members(私有成員),即使它們在 base class(基類)中是 protected(保護)的或 public(公有)的。

  行為不過如此。這就給我們帶來了含義。private inheritance(私有繼續)意味著 is-implemented-in-terms-of(是根據……實現的)。假如你使 class(類)D 從 class(類)B 私有繼續,你這樣做是因為你對于利用在 class(類)B 中才可用的某些特性感愛好,而不是因為在 types(類型)B 和 types(類型)D 的 objects(對象)之間有什么概念上的關系。同樣地,private inheritance(私有繼續)純粹是一種實現技術。(這也就是為什么你從一個 private base class(私有基類)繼續的每一件東西都在你的 class(類)中變成 private(私有)的原因:它全部都是實現的細節。)利用《接口繼續和實現繼續》中提出的條款,private inheritance(私有繼續)意味著只有 implementation(實現)應該被繼續;interface(接口)應該被忽略。

  假如 D 從 B 私有繼續,它就意味著 D objects are implemented in terms of B objects(D 對象是根據 B 對象實現的),沒有更多了。private inheritance(私有繼續)在 software design(軟件設計)期間沒有任何意義,只在 software implementation(軟件實現)期間才有。 private inheritance(私有繼續)意味著 is-implemented-in-terms-of(是根據……實現的)的事實有一點混亂,正如《通過composition模擬“has-a”》一文中所指出的 composition(復合)也有同樣的含義。你怎么預先在它們之間做出選擇呢?答案很簡單:只要你能就用 composition(復合),只有在絕對必要的時候才用 private inheritance(私有繼續)。什么時候是絕對必要呢?主要是當 protected members(保護成員)和/或 virtual functions(虛擬函數)摻和進來的時候,另外還有一種與空間相關的極端情況會使天平向 private inheritance(私有繼續)傾斜。我們稍后再來操心這種極端情況。

  究竟,它只是一種極端情況。
假設我們工作在一個包含 Widgets 的應用程序上,而且我們認為我們需要更好地理解 Widgets 是怎樣被使用的。例如,我們不僅要知道 Widget member functions(成員函數)被調用的頻度,還要知道 call ratios(調用率)隨著時間的流逝如何變化。帶有清楚的執行階段的程序在不同的執行階段可以有不同的行為側重。例如,一個編譯器在解析階段對函數的使用與優化和代碼生成階段就有很大的不同。

  我們決定修改 Widget class 以持續跟蹤每一個 member function(成員函數)被調用了多少次。在運行時,我們可以周期性地檢查這一信息,與每一個 Widget 的這個值相伴的可能還有我們覺得有用的其它數據。為了進行這項工作,我們需要設立某種類型的 timer(計時器),以便在到達收集用法統計的時間時我們可以知道。

  盡可能復用已有代碼,而不是寫新的代碼,我在我的工具包中翻箱倒柜,而且滿足地找到下面這個 class(類):

  class Timer {
  public:
  explicit Timer(int tickFrequency);
  virtual void onTick() const; // automatically called for each tick
  ...
  };

  這正是我們要找的:一個我們能夠根據我們的需要設定 tick 頻率的 Timer object,而在每次 tick 時,它調用一個 virtual function(虛擬函數)。我們可以重定義這個 virtual function(虛擬函數)以便讓它檢查 Widget 所在的當前狀態。很完美!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www.色综合| 亚洲一区二区久久| 91久久精品日日躁夜夜躁国产| 中文字幕日韩免费视频| 中文字幕国产日韩| 亚洲综合日韩在线| 欧美色视频日本高清在线观看| 久久久久久高潮国产精品视| 欧美日韩精品在线| 亚洲欧美在线磁力| 久久久伊人日本| 国产精品h在线观看| 日韩美女写真福利在线观看| 欧美亚洲国产精品| 欧美亚洲成人精品| 欧美日韩免费看| 精品国产乱码久久久久酒店| 亚洲a在线观看| 国产精品一区二区久久久| 亚洲精品国产电影| 欧美日韩一区二区三区| 亚洲精品综合久久中文字幕| 久久91精品国产| 中日韩午夜理伦电影免费| 亚洲久久久久久久久久| 久久精品国产亚洲精品2020| 久久久在线视频| 国产亚洲精品久久久久久| 欧美做受高潮电影o| 美女久久久久久久久久久| 日韩精品在线电影| 精品高清美女精品国产区| 国产一区二区三区四区福利| 亚洲国产精品成人av| 国语自产偷拍精品视频偷| 亚洲中国色老太| 欧美自拍大量在线观看| 91久久国产综合久久91精品网站| 亚洲人永久免费| 久久久久久久爱| 97在线免费观看视频| 欧美精品午夜视频| 国产精品久久久久久久久借妻| 欧美性猛交xxxx乱大交极品| 成人激情视频在线| 亚洲欧美日韩一区二区三区在线| 日韩欧美在线字幕| 亚洲qvod图片区电影| 97视频在线观看免费高清完整版在线观看| 欧美裸体xxxx极品少妇软件| 欧美日韩精品中文字幕| 亚洲人成啪啪网站| 国产精品中文字幕久久久| 亚洲毛片一区二区| 亚洲国产私拍精品国模在线观看| 国产成人精品视频在线观看| 91chinesevideo永久地址| 97在线视频免费| 国产在线拍偷自揄拍精品| 日韩黄色高清视频| 亚洲午夜色婷婷在线| 精品国产999| 色偷偷9999www| 91国语精品自产拍在线观看性色| 亚洲色图13p| 久久久亚洲国产天美传媒修理工| 成人av资源在线播放| 国产在线精品自拍| 最好看的2019的中文字幕视频| 久久亚洲一区二区三区四区五区高| 欧美激情a∨在线视频播放| 大量国产精品视频| 伊人久久大香线蕉av一区二区| 国产精品免费一区| www.亚洲男人天堂| 午夜精品一区二区三区视频免费看| 久久精品国产一区| 亚洲欧美日韩中文视频| 欧美电影院免费观看| 91国自产精品中文字幕亚洲| 欧美在线激情视频| 国产精品精品久久久| 一二美女精品欧洲| 成人欧美一区二区三区在线| 欧美成人精品一区二区三区| 国自产精品手机在线观看视频| 97超碰色婷婷| 国产精品美女主播在线观看纯欲| 91精品国产自产在线老师啪| 不卡毛片在线看| 欧美不卡视频一区发布| 日韩欧美亚洲国产一区| 久久色免费在线视频| 亚洲一二三在线| 久久久久久成人精品| 亚洲乱码一区av黑人高潮| 91亚洲精品在线| 成人免费在线视频网站| 在线电影av不卡网址| 日韩一级裸体免费视频| 国产精品久久久久久久app| 国产精品久久久精品| 国产精品久久久久久亚洲调教| 亚洲一区二区三区乱码aⅴ| 国产精品99久久久久久久久| 亚洲精品美女久久久久| 欧美日韩福利在线观看| 欧美高清电影在线看| 91啪国产在线| 91免费高清视频| 国产精品va在线播放我和闺蜜| 中文字幕欧美亚洲| 欧美一级电影免费在线观看| 5278欧美一区二区三区| 在线播放国产精品| 97国产在线观看| 亚洲国产小视频在线观看| 亚洲天堂色网站| 日韩国产中文字幕| 欧美床上激情在线观看| 国内精品久久久久久影视8| 国产999精品| 欧美大学生性色视频| 欧美在线视频在线播放完整版免费观看| 欧美黑人xxxⅹ高潮交| 国产日韩精品在线播放| 国色天香2019中文字幕在线观看| 国产免费亚洲高清| 日韩av不卡在线| 欧美激情三级免费| 精品欧美aⅴ在线网站| 精品久久久一区二区| 欧美极品美女电影一区| 国产日韩亚洲欧美| 久久在线观看视频| 亚洲性视频网站| 亚洲人成在线观看| 欧美日韩国产一区在线| 亚洲欧美日韩网| 国产一区二区视频在线观看| 91精品国产91久久久| 在线成人激情黄色| 欧美另类极品videosbest最新版本| 国产精品亚洲综合天堂夜夜| 精品亚洲va在线va天堂资源站| 欧美在线影院在线视频| 日韩h在线观看| 久久亚洲一区二区三区四区五区高| 日韩av免费观影| 在线色欧美三级视频| 91在线免费观看网站| 在线播放日韩精品| 国产日韩在线看片| 亚洲va久久久噜噜噜久久天堂| 51视频国产精品一区二区| 中文字幕日韩精品在线观看| 日本韩国欧美精品大片卡二| 九九精品在线观看| 国产网站欧美日韩免费精品在线观看| 日本精品久久久| 成人黄色免费片| 国产盗摄xxxx视频xxx69| 538国产精品一区二区在线| 亚洲精品久久久一区二区三区|