簡體   English   中英

有沒有我們需要* C ++中的受保護繼承的例子?

[英]Are there any examples where we *need* protected inheritance in C++?

雖然我已經看到需要私有繼承的罕見情況,但我從未遇到過需要保護繼承的情況。 有人有例子嗎?

這里的人似乎錯誤了Protected class繼承和Protected方法。

FWIW,我從未見過有人使用受保護的類繼承,如果我沒記錯,我認為Stroustrup甚至認為“受保護”級別是c ++中的一個錯誤。 如果你刪除了這個保護級別並且只依賴公共和私人,那么你就無法做到這一點。

有一個非常罕見的受保護繼承的用例。 這是您想要使用協方差的地方

struct base { 
    virtual ~base() {} 
    virtual base & getBase() = 0;
}; 

struct d1 : private /* protected */ base { 
    virtual base & getBase() { 
        return this; 
    } 
}; 

struct d2 : private /* protected */ d1 {
    virtual d1 & getBase () { 
        return this; 
    } 
}; 

之前的代碼片段試圖隱藏它的基類,並通過提供“getBase”函數,無論出於何種原因提供基本及其功能的可控可見性。

但是,它會在struct d2失敗,因為d2不知道d1是從base派生的。 因此, covariance行不通的。 解決這個問題的方法是將它們保護起來,以便繼承在d2中可見。

使用此類似的示例是從std::ostream派生,但不希望隨機人員寫入您的流。 您可以提供一個返回std::ostream&的虛擬getStream函數。 該函數可以為下一個操作做一些流准備。 例如,放入某些操縱器。

std::ostream& d2::getStream() {
    this->width(10);
    return *this;
}

logger.getStream() << "we are padded";

C ++ FAQ Lite提到使用私有繼承是一種合法的解決方案(見[24.3。]我應該選擇哪種:組合或私有繼承? )。 當你想通過虛函數(在本例中為derivedFunction() )從私有基類中調用派生類時:

class SomeImplementationClass
{
protected:
    void service() {
        derivedFunction();
    }

    virtual void derivedFunction() = 0;      

    // virtual destructor etc
};

class Derived : private SomeImplementationClass
{
    void someFunction() {
        service();
    }

    virtual void derivedFunction() {
        // ...
    }

    // ...
};

現在,如果你想從Derived類派生,並且你想在派生類中使用Base::service() (比如你想將Derived::someFunction()移動到派生類),那么最簡單的方法就是這是將Base的私有繼承更改為受保護的繼承。

對不起,想不出更具體的例子。 就個人而言,我喜歡將所有繼承公開,以避免浪費時間與“我應該保持繼承關系保護或私人”討論。

暫無
暫無

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

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