2013-07-24 95 views
0

我有一個與C++私有繼承有關的問題。 我的問題是基於與此頁here有關的參考文獻。 (在標題「但是,如果我們確實需要繼承?」)來自客戶端的私有繼承用法

的情況下是一點是,我宣佈一個基類與公共虛函數。然後我在私有繼承下繼承基類並將其命名爲派生類。這如下所示

class base { 
      public: 
      base() {} 
      virtual ~base() {} 
      virtual void func_1() { 
       cout<<"base func1"<<endl; 
      } 
      void func_t() { 
       cout<<"base funct"<<endl; 
       func_3(); 
      } 
      private: 
      void func_3() { 
       cout<<"base func3"<<endl; 
       func_1(); 
      } 
     }; 

class derived: private base { 
public: 
    derived() {} 
    ~derived() {} 
    virtual void func_1() { 
     cout<<"derived func1"<<endl; 
    } 
}; 

base* b = new derived; 
b->func_t(); 

上述語句給出的錯誤是,base是派生的不可訪問的基。 如果我想將func_1作爲派生的上述函數調用函數的一部分來調用,該怎麼辦?

回答

1

private表示名稱和成員不能從外部訪問。與私人基礎班的對話只有一次。你可以簡單地把這個包聊到成員函數讓它工作:

class derived 
    : private base { 
public: 
    // other stuff 

    base* get_base() { 
     return this; 
    } 
}; 

derived* d = new derived; 
base* b = d->get_base(); 
b->func_t(); 
+0

噢,它確實有效。謝謝:) –

1

既然你繼承base爲私有基類,這意味着base所有公共成員(包括base::func_1)將在派生的私有。當您聲明derived::func_1public時,編譯器會發出抱怨。

如果您需要derived::func_1公衆,那麼你應該繼承base公開。如果你不需要公開,那麼你應該聲明derived::func_1是私人的。

+0

你好,如果你看一下鏈接我做了一個參考,他繼承的基礎私下仍虛函數在派生爲公衆。 –

+0

我沒有詳細看它,但它仍然打破封裝。 – utnapistim