簡體   English   中英

在派生類中使用私有抽象方法

[英]Using private abstract method in derived class

我不了解以下限制:

class Base
{    
    virtual doFoo() = 0;
};

class Derived : public Base
{
public:
    void doStuff() { doFoo(); } //compile error, doFoo is a private member of Base    
};

解決方案當然是在派生類中重新聲明成員,但對我來說似乎有些奇怪:

class Derived : public Base
{
public:
    void doStuff() { doFoo(); }

private:
    virtual doFoo() = 0;
};

為什么不能在未重新聲明的情況下在派生類中使用基類的抽象虛擬私有方法? 似乎過於嚴格的限制,因為如果我使用它但未定義它,則Derived仍然是抽象的,並且要實例化它,還必須提供一些進一步的派生類來提供doFoo

直觀地說,如果不定義(或重新聲明),則表示未使用該方法,該方法也不是派生類的一部分,但對於代碼讀取者而言,比對編譯器而言,更多。 還是編譯器確實也需要該信息,這是真正的原因嗎?

私有基類函數不能在派生類方法中直接調用。 但是,派生類的這種不可訪問性與派生類的虛擬調用機制沒有任何關系。

在某些情況下,這是理想的。 取自C ++常見問題解答

您可能會問,派生類無法調用的方法有什么用? 即使派生類無法在基類中調用它,基類也可以調用它,從而有效地調用(適當的)派生類。 這就是模板方法模式的全部意義。

想想“回到未來”。假設基類是去年編寫的,今天晚些時候您將要創建一個新的派生類。 基類的方法(可能已在幾個月前編譯並粘貼到庫中)將調用私有(或受保護的)虛擬方法,並有效地“調用未來”-幾個月前編譯的代碼將調用代碼甚至還不存在-您將在接下來的幾分鍾內編寫代碼。 您無法訪問基類的私有成員-您無法訪問過去,但是過去可以訪問未來,並調用您尚未編寫的方法。

在派生類中聲明一個新的成員函數不能使您訪問基類中具有相同名稱的成員函數。 基類中的那個仍然是私有的,您不能從基類外部訪問它(缺少朋友聲明)。 這與成員函數是純虛擬的無關; 它適用於所有名稱。 如果您不希望它是私有的,則不要將其定義為私有。

如果要從派生類訪問此方法,一個好的方法是將其聲明為protected

在這里,即使您沒有將方法聲明為private ,對class的默認訪問權限也是private 這意味着您將隱式聲明此方法為private

(如果您一直使用struct ,則默認訪問權限將是public 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM