2011-03-09 49 views
7

這是一個面試問題。我不是一個C++專家還,所以我需要在尋找這個問題的答案一定的幫助(我首先要明白這個問題...是一個有效的問題?)C++:有選擇地限制對超類的方法的訪問?

問:

假設我有一個B類從A類派生 ,我想重用 一些,但不是所有的A. 的方法,我將如何限制訪問 父類的方法選擇?

謝謝!

+0

您可能是指您*想重用** A ***的某些方法。 – 2011-03-09 12:12:13

+0

是的..我做了更正..謝謝.. – maxpayne 2011-03-09 12:18:47

回答

10

我認爲

  1. 你不能改變你要選擇從A方法應該是從B對象訪問的的A
  2. 定義。

using指令可以解決您的問題。例如:

class A 
{ 
public: // or protected for that matter 
    void foo(); 
    void bar(); 
}; 

class B : private A // or protected, depending on whether 
        // you want subclasses of B to expose 
        // some methods from A themselves 
{ 
public: 
    using A::foo; 
}; 

使得從Bfoo可用的,但不是bar。但作爲警告,請注意using A::foo將暴露foo的所有超載。

+1

這是一個很好的解決方案,履行給出的問題。但是,應該指出,B類與繼承層次是完全分開的,所以不可能做類似「B objB; A * ptrA = &objB;」的事情。對於這個問題,AFAIK並沒有完全令人滿意的解決方案。 – Baltasarq 2011-03-09 12:16:06

+0

@Baltasarq:如果你可以通過一個指向'A'的裸指針來訪問它們,那麼限制'A'的方法又有什麼意義呢?回想一下,私有繼承是**而不是**是「關係」。它只與「正常」公共繼承有關,應該被視爲合成設備。 – 2011-03-09 12:17:34

+0

你能解釋一下嗎?「但作爲一個警告,請注意使用A :: foo將暴露foo的所有重載」? – maxpayne 2011-03-09 12:24:41

3

他們可能想要聽到的答案是,您可以將方法重用於基類的protected部分,派生類不應該可見的方法應該放入private部分。

但是,退一步說,通過指出可能有更好的措施來重用代碼,這取決於函數的作用(例如使用自由函數,它們在頭文件)。

+0

什麼是免費功能? – maxpayne 2011-03-09 12:21:05

+0

@maxpayne:簡單的香草功能,即。函數不是成員函數(「方法」) – 2011-03-09 12:33:26

+0

雖然你的解決方案真的很簡單,乾淨......我認爲如果不允許更改A類代碼,它就不會成立。 – maxpayne 2011-03-09 12:39:50