条款33:避免遮掩继承而来的名称
生活随笔
收集整理的這篇文章主要介紹了
条款33:避免遮掩继承而来的名称
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先看下下面這個例子:
class Base{ private:int x; public:virtual void mf1() = 0;virtual void mf2();void mf3();... }; class Derived : public Base{ public:virtual void mf1();void mf4();... }; 這個函數里面還有純虛函數,虛函數以及非虛函數。 如果這里derived class調用了一個mf2函數的話,那么那么會先在derived class的范圍類線進行mf2的查找,再在base class中進行查找,最后才是全局作用域。 那么如果是下面這個例子的話: 1 class Base{ 2 private: 3 int x; 4 public: 5 virtual void mf1() = 0; 6 virtual void mf1(int); 7 virtual void mf2(); 8 void mf3(); 9 void mf3(double); 10 ... 11 }; 12 class Derived : public Base{ 13 public: 14 virtual void mf1(); 15 void mf3(); 16 void mf4(); 17 ... 18 }; 在這個例子中,基類中的所有的被聲明為mf1,mf3的函數都會被覆蓋掉(注意,不管參數列表是如何的,也不管基類中是virtual還是non-virtual函數)。 如果這種情況下想要能夠選取到基類作用域中的mf1以及mf3,使得繼承機制能夠起作用的話就應該使用using聲明: 1 class Base{ 2 private: 3 int x; 4 public: 5 virtual void mf1() = 0; 6 virtual void mf1(int); 7 virtual void mf2(); 8 void mf3(); 9 void mf3(double); 10 ... 11 }; 12 class Derived : public Base{ 13 public: 14 using Base::mf1; 15 using Base::mf3; 16 virtual void mf1(); 17 void mf3(); 18 void mf4(); 19 ... 20 };然而可能有時候不希望集成基類中的所有函數,這時候就應該注意了,應為public提供的is-a的關系,所以說如果一旦不希望繼承基類中的所有的函數,那么可能public集成并不是真正我們希望用到的關系,正如一個矩形與一個正方形之間的關系一樣。這種只想繼承一部分函數的欲望在私有繼承制之下是可以得到滿足的,例如下面這樣:(不過要用到一點技巧)
1 public: 2 virtual void mf1() = 0; 3 virtual void mf1(int); 4 ... 5 }; 6 class Derived: private Base{ 7 public: 8 virtual void mf1(){ // 注意這里只能使用這種形式進行函數的轉接,使用類似前面的類似的using聲明達不到相同的結果。 9 Base::mf1(); 10 }//轉交函數。 11 }; 類似的,轉交函數也同樣用在不支持using聲明的編譯器上面。 小結: 1.derived class中的名稱會遮掩bass class中的名稱,這是使用public集成不希望看到的 2.出現這種情況時,可以使用using聲明護著轉接函數來改善這種情況。轉載于:https://www.cnblogs.com/-wang-cheng/p/4889762.html
總結
以上是生活随笔為你收集整理的条款33:避免遮掩继承而来的名称的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [C++基金会]位计算 游戏开发中的应用
- 下一篇: unity脚本运行顺序具体的解释