儘管所有的調用聲明一個虛擬的成員私人,參數根本不持水。通常,派生類的虛擬函數覆蓋必須調用基類版本。它不能如它宣佈private
:
class Base
{
private:
int m_data;
virtual void cleanup() { /*do something*/ }
protected:
Base(int idata): m_data (idata) {}
public:
int data() const { return m_data; }
void set_data (int ndata) { m_data = ndata; cleanup(); }
};
class Derived: public Base
{
private:
void cleanup() override
{
// do other stuff
Base::cleanup(); // nope, can't do it
}
public:
Derived (int idata): base(idata) {}
};
您有聲明基類方法protected
。
然後,你必須採取醜陋的指示方式,通過評論該方法應該被覆蓋,但沒有調用。
class Base
{
...
protected:
// chained virtual function!
// call in your derived version but nowhere else.
// Use set_data instead
virtual void cleanup() { /* do something */ }
...
因此,草藥薩特的指導方針#3 ......但是馬已經離開了穀倉。
當你聲明的東西protected
你隱含信任任何派生類的作家正確理解和使用受保護的內部,只是friend
聲明意味着private
成員更深的信任的方式。
違反該信任而獲得不良行爲的用戶(例如,通過不打擾閱讀您的文檔標記爲「無知」)的用戶只能責怪自己。
更新:我有一些反饋,聲稱你可以使用私有虛函數以這種方式「鏈接」虛函數實現。如果是這樣,我一定會喜歡看到它。
我使用的C++編譯器絕對不會讓派生類實現調用私有基類實現。
如果C++委員會放寬「私人」以允許這個特定的訪問,我會全部用於私人虛擬功能。就目前而言,我們仍然被建議在馬被盜後鎖上馬廄門。
我認爲這個問題是倒退的。讓事物變成虛擬的原因總是一樣的:允許派生類來覆蓋它。所以問題應該是:使虛擬方法具有私密性的優點是什麼?答案是:默認情況下一切都是私有的。 :-) – ShreevatsaR 2014-04-02 16:58:29
@ShreevatsaR但是你甚至沒有回答你自己的問題...... – Spencer 2018-03-01 23:35:16