(1) 公有繼承(public)
公有繼承的特點是基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被這個派生類的子類所訪問。
(2)私有繼承(private)
私有繼承的特點是基類的公有成員和保護成員都作為派生類的私有成員,並且不能被這個派生類的子類所訪問。
(3)保護繼承(protected)
保護繼承的特點是基類的所有公有成員和保護成員都成為派生類的保護成員,並且只能被它的派生類成員函數或友元訪問,基類的私有成員仍然是私有的。
private能夠對外部和子類保密,即除了成員所在的類本身可以訪問之外,別的都不能直接訪問。protected能夠對外部保密,但允許子類直接訪問這些成員。public、private和protected對成員數據或成員函數的保護程度
總結:
(1). public繼承是一個接口繼承,保持is-a原則,每個父類可用的成員對子類也可用, 因為每個子類對象也都是一個父類對象。
(2). 基類的private成員 在派生類中是不能被訪問的, 如果基類成員 不想在類外直接被訪問, 但需要 在派生類中能訪問, 就定義為protected。 可以看出保護成員 限定符是因繼承才出現的。
(3). protected/private繼承是一個實現繼承, 基類的部分成員 並非完全成為子類接口 的一部分, 是 has-a 的關系原則, 所以非特殊情況下不會使用這兩種繼承關系, 在絕大多數的場景下使用的 都是公有繼承。 私有繼承以為這is-implemented-in-terms-of(是根據……實現的) 。 通常比組合(composition) 更低級, 但當一個派生類需要訪問 基類保護成員 或需要重定義基類的虛函數時它就是合理的。
(4). 不管是哪種繼承方式, 在派生類內部都可以訪問基類的公有成員和保護成員 , 基類的私有成員存在但是在子類中不可見( 不能訪問) 。
(5). 使用關鍵字class時默認的繼承方式是private, 使用struct時默認的繼承方式是public, 不過最好顯式的寫出繼承方式。
(6). 在實際運用中一般使用都是public繼承, 極少場景下才會使用protetced/private繼承。
在struct繼承中,如果沒有顯式給出繼承類型,則默認的為public繼承;在class繼承中,如果沒有顯式給出繼承類型,則默認的為private繼承;
LittleGirl.h
#pragma once #include "human.h" class LittleGirl : public human { public: LittleGirl(string name); LittleGirl(); ~LittleGirl(); };
LittleGirl.cpp
#include "stdafx.h" #include "LittleGirl.h" /* 可以這樣調用父級的構造函數。沒有注明繼承方式,默認是private繼承,相當於“private human(name)” 另外2種繼承方式是:“public human(name)”,“protected human(name)” 如果是多繼承,則是:“public human(name),public 其它基類(name)”,繼承的數量不限,用“,”分割就可以了。 */ LittleGirl::LittleGirl(string name):human(name) { } LittleGirl::LittleGirl() { } LittleGirl::~LittleGirl() { }
human.h
#pragma once #include<string> using namespace std; class human { public: human(string name); human(); ~human(); int x; };
human.cpp
#include "stdafx.h" #include "human.h" human::human(string name) { } human::human() { } human::~human() { }
