C 三種繼承

2021-09-19 05:20:27 字數 2121 閱讀 2850

特徵

公有繼承

保護繼承

私有繼承

公有成員變成

派生類共有成員

派生類受保護成員

派生類私有成員

受保護成員變成

派生類受保護成員

派生類受保護成員

派生類私有成員

私有成員變成

派生類只能通過基類介面訪問

派生類只能通過基類介面訪問

派生類只能通過基類介面訪問

能否隱式向上轉型

是是(只能在派生類中)

否表示了兩個類有is-a的關係,我的另一篇部落格介紹了公有繼承,這裡不再說明。

表示了兩個類有has-a的關係;對於私有繼承,基類的public介面到了派生類變成了private,則,派生類不會對外提供基類的介面,這就是說私有繼承是has-a關係的原因

同樣的,在呼叫派生類建構函式之前,要先呼叫基類構造,如果預設成員初始化列表,呼叫基類的預設無參構造

class a 

};class b : private a

};

i>基類成員

私有繼承中,可以將基類當作是乙個未命名的子物件成員,可以通過強制型別轉換「給這個物件命名」

class b : private a

void f()

};

通過乙個基類引用給基類命名,這樣,就相當於是b中宣告了乙個a的子物件;對於obja來說,他是乙個基類物件,他可以呼叫基類的介面

當然,對於公有繼承,也可以這樣做,但是共有繼承對外提供基類介面,不是has-a的關係,這樣做並沒有意義。

ii>基類方法

第一種訪問方式就是通過上面的給基類成員命名的方式。

接下來介紹第二種方式

對於基類的方法,在派生類中變為了private,所以,在類外,是無法訪問的,但是在派生類中,仍然可以訪問(類內可以訪問自己的私有)。

class b : private a

void f()

};

可以顯式地轉換,這裡必須強制型別轉換,否則會報錯

int main()
這裡認真討論一下

這裡地b物件被當作乙個a的例項化物件。因此,f()是否可以訪問與f()在a中宣告的訪問許可權有關 

f()為非虛函式

採用靜態聯編

f()為虛函式

採用動態聯編,pa指向了b物件,所以會呼叫b::f();這裡不關心b::f()的訪問許可權,因為在pa指標看來,只能通過虛函式表來呼叫函式,許可權資訊是a::f()的許可權,所以,如果基類f()為公有,不論派生類f()的訪問許可權是什麼,都可以訪問。但是,如果用b的指標來指,就會有訪問許可權限制。

這裡雖然必須用顯式地方法向上轉型,但是和公有繼承有很多共通之處

保護繼承與私有繼承一樣,同樣不為外部提供介面,同樣可看作has-a關係

對於介面來說,私有繼承無法訪問間接基類的介面,而保護繼承在繼承鏈中,可以訪問所有基類的介面。

私有繼承將基類介面變為私有,則再次派生時,就會變得不可見。

雖然說私有繼承和保護繼承建立了has-a的關係,但是不同於直接的子物件包含,繼承仍然有繼承的一些特性,比如說虛函式。

class b : private a;
使用using宣告重新定義派生類可以訪問的成員的訪問許可權。這 樣,就相當於在b中相應的訪問許可權區域宣告。

注意:派生類如果不可以訪問,則不能修改許可權,也就是說,不能修改派生類中的私有成員的訪問許可權。甚至可以將protected成員變成公有

class a 

void f()

};class b : private a

using a::a; //派生類可以訪問受保護,所以可以改變訪問許可權

using a::f;

};int main()

C 三種繼承

1 公有 私有 受保護繼承 class b public a class b public a class b protected a 繼承方式 成員型別 public protected private public public protected 無法繼承 protected protecte...

C 三種繼承方式

公有繼承 public 私有繼承 private 保護繼承 protected 是常用的三種繼承方式。1.公有繼承 public 2.私有繼承 private 私有繼承的特點是基類的公有成員和保護成員都作為派生類的私有成員,並且不能被這個派生類的子類所訪問。3.保護繼承 protected 保護繼承...

C 三種繼承方式

繼承是使 可以復用的重要手段,也是物件導向程式設計的核心思想之一。簡單的說,繼承是指乙個物件直接使用另一物件的屬性和方法。繼承呈現了 物件導向程式設 計的層次結構,體現了 由簡單到複雜的認知過程。c 中的繼承關係就好比現實生活中的父子關係,繼承一筆財產比白手起家要容易得多,原始類稱為基類,繼承類稱為...