C++ 中私有繼承、保護繼承與公有繼承

區別

下面經過一個示例來介紹三種繼承的區別。spa

定義一個基類(假設爲一個快退休的富豪):設計

class RichMan
{
public:
    RichMan();
    ~RichMan();
    int m_company;    
private:
    int m_money;
    int m_car;
protected:
    int m_house;
    
};
  • 公司是public的,那麼他本身(基類),創業夥伴(友元),兒子(子類),其餘人(外部)均可以訪問。
  • 錢和車子是private的,本身(基類),創業夥伴(友元)能夠訪問。兒子(子類)和外人都不給開。
  • 房子是protected的,本身(基類),創業夥伴(友元)能夠訪問,兒子(子類)也能夠訪問,外人是不能夠訪問。

 現在他要退休,但願尋找繼承人。這裏有三種繼承方式:code

1.公有繼承:public

他的兒子繼承了他:LittleRichMan類對象

class LittleRichMan :
    public RichMan
{
public:
    LittleRichMan();
    ~LittleRichMan();
};

通過public繼承後,LittleRichMan的成員訪問權限變成以下形式:blog

#include "RichMan.h"
class LittleRichMan :
    public RichMan
{
public:
    LittleRichMan();
    ~LittleRichMan();
    int m_company;//彷彿
protected:
    int m_house;//彷彿
};

也就是說,public成員保持不變,private成員不可見,protected成員也保持不變。繼承

他的兒子繼續開着公司,住着房子,但他爸爸的車子和錢是拿不到了。接口

繼續,若採用私有(private)繼承:it

2.私有繼承:private

class LittleRichMan :
    private RichMan
{
public:
    LittleRichMan();
    ~LittleRichMan();
private:
    int m_company;//彷彿
    int m_house;//彷彿
};

能夠想象他的兒子是個自私的人,經過private的方式繼承:public和protected變成了private。class

本身佔用了公司和房子,這樣除了本身和友元,任何方式都不得訪問。軟件

最後,protected繼承:

保護繼承:protected

class LittleRichMan :
    private RichMan
{
public:
    LittleRichMan();
    ~LittleRichMan();
protected:
    int m_company;//彷彿
    int m_house;//彷彿
};

原先的public變成了protected,protected保持不變。這樣,公司和房子是除了外人不能夠訪問,本身,友元,子類均可以訪問。

謹慎使用private繼承

在C++中。公有繼承強調的是 「is-a」 的關係,即一個派生類能夠當成一個基類來看待,屬於同一類。例如:男人(子類)/女人(子類)都是人(父類)。

對於private繼承而言,並不存在這樣一種關係,爲何?

在private繼承中,父類全部的成員在子類繼承後都會變成private(私有)屬性,縱使它們在父類中本來是protected或public屬性。

 

採用private繼承的意義

  •   Private繼承意味着implement-in-terms-of(根據某物實現出)。若你讓class D以private繼承class B,你的用意是爲了採用class B內已經備妥的某些特性,不是由於B對象和D對象存在有任何觀念上的關係。
  •   private繼承純粹是一種實現技術(這就是爲何繼承自一個private base class的每樣東西在你的class 內都是private的:由於它們都只是實現枝節而已)。
  •   private繼承意味着只有實現部分被繼承,接口部分應略去。
  •   若是D以privae繼承B,意味着D對象根據B對象實現而得,再沒有其餘涵義了。
  •   Private繼承在軟件 「設計」 層面沒有意義,其意義只及於軟件實現層面。
相關文章
相關標籤/搜索