2017-08-14 104 views
-1

我要去通過在C繼承的概念++,並試圖這樣的代碼:有沒有辦法調用基類函數,它在派生類中使用了私有繼承?

class base{ 
    public: 
    void display(int j) 
    { 
     cout<<j<< " base "<<endl; 
    } 
}; 

class derived:private base{ 
    public: 
    using base::display; 
    void display(int k) 
    { 
     cout<<k<< " derived "<<endl; 
    } 
}; 

int main() 
{ 
    derived obj; 
    obj.display(10); 
    //obj.base::display(46); --> cannot be used as base is privately inherited. Also conversion from derived to base cannot happen in this case. 

    return 0; 
} 

在上述情況下,是否有任何方式通過在反正使用obj調用從主基類display功能?

如果基函數沒有在派生類中被覆蓋,那麼通過using(如果基函數在派生類中被重載函數隱藏),我可以在派生類中聲明它並使用派生類obj調用它。但是在基函數被派生於私有繼承的情況下,有沒有辦法調用基函數?當我學習C++時,我只是好奇地想知道是否有任何方法可以做到這一點(不考慮任何實際的用例)。

+1

'私人'繼承是特殊的,可能是最少使用。如果你想從基地訪問一個方法,那麼你只是不使用私有繼承 – user463035818

+1

@ tobi303正如OP指出的,如果你不覆蓋它,你可以使用私有繼承與公共'using'。如果您只想看到基類的某些功能,這非常有用。例如。 –

+0

@ tobi303,謝謝你的迴應。我知道訪問基類函數的方法。但我只是很想知道**我清楚提到的這個特例**。因爲如果函數沒有被覆蓋,我可以用派生對象調用基類函數,即使它們是隱藏的。 –

回答

-1

使用虛函數概念可以訪問私有繼承的基類函數。 使用基類的指針對象並通過將指針對象指向基類對象並調用display()函數來訪問繼承的成員函數

+1

如何在使用私有繼承時獲取指向基類的指針? –

+0

爲什麼不能創建指向基類的指針。 –

+0

幫我解決這個問題... –

1

不是直接的,因爲基類中的函數在派生類中是私有的,而使用聲明在這裏沒有幫助。但是您可以使用不同的名稱向派生類添加一個函數,該函數調用基函數。沒有評論導致這種複雜性的設計問題。

+0

您能否添加關於爲什麼「使用」聲明不起作用的信息?只是因爲它被覆蓋了,對吧? –

+0

@DanielH,正好。如果函數被覆蓋,那麼使用object調用將調用派生函數而不是基函數(如果它被重載,關鍵字爲'using',則它可以直接調用,類似於** redeclare **基類函數明確地派生的) –

+0

「using」聲明沒有幫助的原因不是基本版本被覆蓋;這是兩個函數**具有相同的簽名**。如果基本版本不是虛擬的,'using'指令仍然不能從派生類中調用它。該函數的基本版本仍然與派生版本具有相同的簽名,並且仍然無法區分這兩個版本。 –

相關問題