条款33:避免遮掩继承而来的名称
生活随笔
收集整理的這篇文章主要介紹了
条款33:避免遮掩继承而来的名称
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
首先看下下面這個(gè)例子:
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();... }; 這個(gè)函數(shù)里面還有純虛函數(shù),虛函數(shù)以及非虛函數(shù)。 如果這里derived class調(diào)用了一個(gè)mf2函數(shù)的話(huà),那么那么會(huì)先在derived class的范圍類(lèi)線(xiàn)進(jìn)行mf2的查找,再在base class中進(jìn)行查找,最后才是全局作用域。 那么如果是下面這個(gè)例子的話(huà): 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 }; 在這個(gè)例子中,基類(lèi)中的所有的被聲明為mf1,mf3的函數(shù)都會(huì)被覆蓋掉(注意,不管參數(shù)列表是如何的,也不管基類(lèi)中是virtual還是non-virtual函數(shù))。 如果這種情況下想要能夠選取到基類(lèi)作用域中的mf1以及mf3,使得繼承機(jī)制能夠起作用的話(huà)就應(yīng)該使用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 };然而可能有時(shí)候不希望集成基類(lèi)中的所有函數(shù),這時(shí)候就應(yīng)該注意了,應(yīng)為public提供的is-a的關(guān)系,所以說(shuō)如果一旦不希望繼承基類(lèi)中的所有的函數(shù),那么可能public集成并不是真正我們希望用到的關(guān)系,正如一個(gè)矩形與一個(gè)正方形之間的關(guān)系一樣。這種只想繼承一部分函數(shù)的欲望在私有繼承制之下是可以得到滿(mǎn)足的,例如下面這樣:(不過(guò)要用到一點(diǎn)技巧)
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(){ // 注意這里只能使用這種形式進(jìn)行函數(shù)的轉(zhuǎn)接,使用類(lèi)似前面的類(lèi)似的using聲明達(dá)不到相同的結(jié)果。 9 Base::mf1(); 10 }//轉(zhuǎn)交函數(shù)。 11 }; 類(lèi)似的,轉(zhuǎn)交函數(shù)也同樣用在不支持using聲明的編譯器上面。 小結(jié): 1.derived class中的名稱(chēng)會(huì)遮掩bass class中的名稱(chēng),這是使用public集成不希望看到的 2.出現(xiàn)這種情況時(shí),可以使用using聲明護(hù)著轉(zhuǎn)接函數(shù)來(lái)改善這種情況。轉(zhuǎn)載于:https://www.cnblogs.com/-wang-cheng/p/4889762.html
總結(jié)
以上是生活随笔為你收集整理的条款33:避免遮掩继承而来的名称的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [C++基金会]位计算 游戏开发中的应用
- 下一篇: unity脚本运行顺序具体的解释