2016-08-05 32 views
-4

我正在學習繼承的概念,特別是關於訪問說明符,在這裏我對protected訪問說明符感到困惑。被保護的成員可以被基類成員函數和派生類成員函數訪問。如果我們聲明protected爲訪問說明符,則可能會搞亂基類的implementation。它總是更好地申報private下的數據成員,而不是保護,因爲只有interface公開,而不是implementation部分。我們只聲明一個類的私有部分中的變量以及它如何變成implementation?實施將在member functions完成嗎?條款很混亂,任何人都可以澄清並解釋我的條款?C++中的接口與實現。這是什麼意思?

+1

提供評論atleast而不是down-voting: -/ –

+0

受保護的成員函數可能適用於子類可能需要的實用類型函數,但仍然不公開。它們也可以用於父類調用的虛函數,然後在子類中重寫,以提供一些特定但尚未公開的操作。 –

+3

如果你使用它們,這些想法會變得更加清晰。現在你的問題不是很清楚。 – doctorlove

回答

2

接口和實現並不是特定於C++的想法,它聽起來像是對什麼接口和實現是一般感到困惑,所以希望通過解釋它們是什麼將會更容易在C++中理解它。

This SO question(雖然不完全是你問)有一個接口是什麼一個很好的定義:

接口是合同:這傢伙寫的接口說,「哎,我接受這樣看待的東西「,而使用界面的人說:」好吧,我寫的課程就是這樣看的「。

一個接口是一個空殼,只有方法的簽名,這意味着方法沒有一個主體。界面不能做任何事情。這只是一種模式。

而在他的實施例的接口被(翻譯成C++):

class MotorVehicle 
{ 
public: 
    virtual void run() const = 0; 
    virtual int getFuel() const = 0; 
} 

然後是實施是:

class Car : public MotorVehicle 
{ 
    int fuel; 

public: 
    void run() const override 
    { 
     printf("Wrroooooooom\n"); 
    } 


    int getFuel() const override 
    { 
     return this->fuel; 
    } 
} 

實施是實際想法背後的物質接口的實際定義將如我們所期望的那樣。另一個例子:就算法而言,我們討論的是深度優先搜索(DFS),它具有明確定義的行爲,但我們如何代碼實現,算法可以變化。例如,我們可以使用遞歸或堆棧數據結構。

現在作爲訪問說明符:使用protected訪問不錯。我們將繼承作爲一個「is-a」的關係來討論。當我們說Cat繼承自Animal時,我們也說CatAnimal。所以對於Cat來說使用Animal的一些實例變量是完全正常的,因爲應該無論如何都屬於Cat

你擔心子類會通過改變實例變量來搞亂超類的功能。你當然可以通過從子類中拋出無意義的數據來做到這一點,但通常你不這樣做。你可以使用實例變量作爲他們想要使用的超類(否則你確實會搞砸功能),這應該被記錄下來。如果您仍然認爲有人不應該使用您的實例變量,那麼這就是private說明符的用途。

最後一件事:重寫超類方法還應該防止濫用超類變量。通過訪問和寫入protected變量,您可能會將超類方法的行爲更改爲不希望的東西,但是應該重寫這些方法以執行您的子類打算執行的新操作。

+0

聽起來他對一般的界面和實現有些困惑,所以我想我會回答這個問題。我應該將引用的示例更改爲C++嗎? –

+0

_「我應該將引用的示例更改爲C++嗎?」_是的,這樣會更好,其他所有內容都會讓未來的訪問者感到困惑。 –