關於繼承和動態繫結的機制

2021-04-20 03:46:14 字數 1648 閱讀 6677

faq 2.24

繼承是乙個很強大的手段,它具有很強的擴張能力,它使軟體可以有is-a和kind-of的關係。

在下面的例子裡,類vehicle定義了乙個=0的成員函式; 也就是在startengine()成員函式的宣告後面寫上"=0";這種語法的意思是startengine()成員函式是純虛函式並且vehicle類是乙個抽象的基類。實際上,對於其他的類來說,vehicle是乙個重要的用來繼承的類。那些繼承的類,通常需要提供乙個startengine()成員函式。

class vehicle ;

vehicle::~vehicle()

(1) 基類的析構函式通常是虛函式

應用程式多半在編譯時不需要知道繼承類,而只知道基類就可以了。例如,下面的函式知道基類,而不知道繼承類。

void f(vehicle& v)

如果基類被合理的設計,應用程式的一大部分將被寫在該層次上,那麼增加新的繼承類不會對應用程式產生衝突,另外,最小的連鎖反應是增加新類最希望達到的目標,例如,下面的繼承類的增加不會影響到函式f().

#include using namespace std;

class car : public vehicle ;

void car::startengine()

class nuclearsubmarine: public vehicle ;

void nuclearsubmarine::startengine()

不影響函式f()的原因在於c++的兩個特徵:is-a轉換是指乙個繼承類的物件,例如乙個car類物件,能作為乙個基類引用傳遞。這樣編譯器就允許乙個從繼承類(例如,car物件)到繼承類(例如,乙個vehicle引用)的轉化。

int main()

is-a轉化總是安全的,因為繼承的意思是"是可代替的",也就是,car是可以替代vehicle的,所示f()函式中如果v是car引用的化並沒有什麼可奇怪的。

動態繫結就相當於一枚同樣的硬幣的另一面,鑑於is-a轉化是從繼承類到基類的安全轉化,動態繫結就是從基類到繼承類的安全轉化,例如。函式f()內的v.startengine()實際上呼叫的是與物件相關的合適的startengine()函式。也就是說,當main()傳遞乙個nuclearsubmarine到fn()時,v.startengine()呼叫的startengine()成員函式與類nuclearsubmarine相關。這是很強大的,因為類

nuclearsubmarine可能在f()函式之後很久才建立和編譯並且可能放在了乙個library內.也就是說,動態繫結允許舊**呼叫新**,(nuclearsubmarine::startengine())而不需要修改舊**甚至重新編譯.這是擴充套件性的本質:在乙個應用程式中增加新的特徵而不會對已存在的**造成重大的衝突的能力。它對c++來說是可行的,但是這需要很好的設計,它不會白白的產生。

uml用下面的符號顯示繼承

動態繫結機制

例題如下 class m public intsum1 public intgeti class n extends m public intsum public intsum1 m m new n system.out.println m.sum 輸出結果為40,system.out.printl...

c 中動態繫結和繼承

1 動態繫結也叫多型性,要掌握從派生類到基類的轉換,使用指標或引用來實現。引用或指標既可以指向基類物件,也可以指向派生類物件。只有通過引用或指標呼叫虛函式才會發生動態繫結。2 c 中有三種繼承方式 公有。私有和受保護繼承。最常用的是公有繼承,基類是什麼型別,公有繼承後還是什麼型別。公有繼承叫做介面繼...

動態繫結屬性和方法 封裝 繼承

class student def init self,name,age self.name name self.age age defeat self print self.name 在吃飯 stu1 student 張三 20 stu2 student 李四 30 print id stu1 p...