這兩天看了c++繼承相關(guān)的知識(shí),現(xiàn)將要點(diǎn)總結(jié)如下:
為什么要繼承?
為避免代碼的重復(fù),減少程序員的工作量,采用繼承的方式將父類的數(shù)據(jù)成員和成員函數(shù)傳給子類,使得子類不用定義就能擁有相關(guān)成員。
繼承的方式:
公有繼承public
保護(hù)繼承protected
私有繼承private
| 繼承方式 | 基類的public成員 | 基類的protected成員 | 基類的private成員 |
|---|---|---|---|
| public | 變?yōu)閜ublic成員 | 變?yōu)閜rotected成員 | 不可見(jiàn) |
| protected | 變?yōu)閜rotected成員 | 變?yōu)閜rotected成員 | 不可見(jiàn) |
| private | 變?yōu)閜rivate成員 | 變?yōu)閜rivate成員 | 不可見(jiàn) |
什么是隱藏?
父類A和子類B中定義了同名的數(shù)據(jù)成員和成員函數(shù)時(shí),子類B中的成員函數(shù)和數(shù)據(jù)成員會(huì)隱藏掉父類A中的成員。體現(xiàn)在當(dāng)實(shí)例化B的對(duì)象后,該對(duì)象只能訪問(wèn)B中定義的成員函數(shù),而A中的同名成員函數(shù)雖然繼承到B中,但并不能被B的實(shí)例訪問(wèn)。若一定要通過(guò)B的實(shí)例訪問(wèn)A中同名成員,必須要加上父類的類名。
注意:父類和子類中的同名函數(shù),即使各自含有不同的參數(shù),子類的實(shí)例仍不能訪問(wèn)父類中與之同名的成員函數(shù)
多繼承和多重繼承
- 多繼承:指一個(gè)子類C,既繼承了父類A,又繼承了父類B
- 多重繼承:指子類C繼承父類B,而B(niǎo)又繼承父類A
- 菱形繼承:繼承與同一個(gè)類的兩個(gè)類,又同時(shí)繼承給下一個(gè)類
虛繼承
虛擬繼承是多重繼承中特有的概念。虛擬基類是為解決多重繼承而出現(xiàn)的。如:類D繼承自類B1、B2,而類B1、B2都繼承自類A(菱形繼承),因此在類D中兩次出現(xiàn)類A中的變量和函數(shù)。為了節(jié)省內(nèi)存空間,可以將B1、B2對(duì)A的繼承定義為虛擬繼承,而A就成了虛擬基類。實(shí)現(xiàn)的代碼如下:
class A
class B1:public virtual A;
class B2:public virtual A;
class D:public B1,public B2;
注意:虛擬繼承在一般的應(yīng)用中很少用到,所以也往往被忽視,這也主要是因?yàn)樵贑++中,多重繼承是不推薦的,也并不常用,而一旦離開(kāi)了多重繼承,虛擬繼承就完全失去了存在的必要因?yàn)檫@樣只會(huì)降低效率和占用更多的空間。