2013-09-30 121 views
0

我想繼承在一個公共圖書館中定義的類,同時覆蓋了它的一些功能和成員類型,我有幾個問題:壓倒一切的超類成員

  1. 的所有功能都被聲明爲虛在超類中,所以重寫這些函數仍然可以嗎?

  2. 我可以通過簡單地聲明具有相同名稱但不同類型的變量來覆蓋成員變量。這與隱藏一樣嗎?

  3. 此外,如果2是可能的,那麼我可以做到以下幾點:

    public class A { 
        public: 
        class Member { 
         Member (//some params) {}; 
        } 
    } 
    
    class B : public A { 
        public: 
        class Member : public A::Member { 
         Member() : 
          A::Member(//some params) 
         { 
          // Some additions to B::Member 
         } 
        } 
    } 
    

注:因爲我不能改變超模板是出了問題。

回答

1
  1. 如果隱藏了基類的功能 - 不能覆蓋他們,因爲他們不是虛擬的 - 你必須記住,某些情況下像通過指針或引用調用基類會不按預期工作,可能會產生「有趣」的結果。如果析構函數是非虛擬的,並且您試圖通過指向基類的指針銷燬派生對象,那麼您也會遇到問題。

  2. 你會隱藏基類的同名成員,但它很可能不會做你期望的。基類實現仍將引用基類的成員,而派生類的實現將引用派生類的成員。

你可能想看看包裹「基地」類,而不是試圖從中得到。

1
  1. 您覆蓋虛擬功能。如果不是,你就躲藏起來。

  2. 它是名稱隱藏。

  3. 不,你不能。

1
  1. 不,你不能覆蓋它們。它將簡單地隱藏它們。
  2. 這不是壓倒性的,它是隱藏的。
  3. 你不能。