C++繼承(一) 三種繼承方式


繼承定義

繼承是使代碼可以復用的重要手段,也是面向對象程序設計的核心思想之一。

繼承就是不修改原有的類,直接利用原來的類的屬性和方法並進行擴展。原來的類稱為基類,繼承的類稱為派生類,他們的關系就像父子一樣,所以又叫父類和子類。

一般格式如下:

class 派生類名 : 繼承類型 基類名

派生類成員可以訪問基類的public成員protected成員

三種繼承方式

繼承類型有三種,共有繼承(public)私有繼承(private)保護繼承(protected)

共有繼承:

共有繼承的特點是基類成員在派生類中都保持原來的狀態

  • 基類中的public仍為public,
  • 基類中的protected仍為protected,
  • 基類中的private仍為private;

私有繼承:

私有繼承的特點是基類中所有成員在派生類中都變為私有成員

  • 基類中的public,protected變為private,
  • 基類中的private仍為private;

保護繼承:

  • 基類中的public變為protected,
  • 基類中的protected仍為protected,
  • 基類中的private仍為private;

private在派生類中依然存在,但不論以哪種方法繼承基類,派生類都不能直接訪問基類的私有成員。

繼承方式 基類的public成員 基類的protected成員 基類的private成員
public繼承 public成員 protected成員 private成員
protected繼承 protected成員 protected成員 private成員
private繼承 private成員 private成員 private成員

for example:

class Base {	//基類 
	public :
		int pub;
	private:
		int pri;
	protected :
		int pro;
};

class A : public Base{	//public繼承 
	public :
		int a;
		void init() {
			a = pub;	//可以,依然為public成員 
			a = pro;	//可以,依然為protected成員 
			a = pri;	//錯誤,基類的私有成員在派生類中是不可見的 
		}
}; 

class B : protected Base{	//protected繼承 
	public :
		int b;
		void init() {
			b = pub;	//可以,變為protected成員 
			b = pro;	//可以,依然為protected成員 
			b = pri;	//錯誤,基類的私有成員在派生類中是不可見的 
		}
}; 

class C : private Base{	//private繼承 
	public :
		int c;
		void init() {
			c = pub;	//可以,變為private成員 
			c = pro;	//可以,變為private成員 
			c = pri;	//錯誤,基類的私有成員在派生類中是不可見的 
		}
}; 
int x;
	A a;
	x = a.pub;	//可以,public繼承的public成員是public的,對對象可見 
	x = a.pro;	//錯誤,public繼承的protected成員是protected的,對對象不可見 
	x = a.pri;	//錯誤,public繼承的private成員是private的,對對象不可見
	
	B b;
	x = b.pub;	//錯誤,protected繼承的public成員是protected的,對對象不可見
	x = b.pro;	//錯誤,protected繼承的protected成員是protected的,對對象不可見
	x = b.pri;	//錯誤,protected繼承的private成員是private的,對對象不可見
	
	C c;
	x = c.pub;	//錯誤,protected繼承的public成員是private的,對對象不可見
	x = c.pro;	//錯誤,protected繼承的protected成員是private的,對對象不可見
	x = c.pri;	//錯誤,protected繼承的private成員是private的,對對象不可見
	return 0;
  • public繼承是一個接口繼承,保持is-a原則,每個父類可用的成員對子類也可用,因為每個子類對象也都是一個父類對象。
  • protetced/private繼承是一個實現繼承,基類的部分成員並非完全成為子類接口的一部分,是has-a的關系原則,所以非特殊情況下不會使用這兩種繼承關系,在絕大多數的場景下使用的都是公有繼承。
  • class的默認繼承是private的,struct的默認繼承是public的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM