掌握了C++多態的特性,寫英雄聯盟的代碼又可以少幾行!

01  LOL 英雄聯盟遊戲需求分析

下面我們用設計 LOL 英雄聯盟遊戲的英雄的例子,說明多態爲什麼可以在修改或增加功能的時候,可以較少的改動代碼。

LOL 英雄聯盟是 5v5 競技遊戲,遊戲中有很多英雄,每種英雄都有一個「類」與之對應,每個英雄就是一個「對象」。

英雄之間能夠互相攻擊,攻擊敵人和被攻擊時都有相應的動作,動作是通過對象的成員函數實現的。

下面挑了五個英雄:

  ● 探險家 CEzreal

  ● 蓋樓 CGaren

  ● 盲僧 CLeesin

  ● 無極劍聖 CYi

  ● 瑞茲 CRyze

基本思路:

1、爲每個英雄類編寫 Attack、FightBack 和 Hurted 成員函數:

  ● Attack 函數表示攻擊動作;

  ● FightBack 函數表示反擊動作;

  ● Hurted 函數表示減少自身生命值,並表現受傷動作。

  ● 設置基類CHero,每個英雄類都繼承此基類

— —

 

02  非多態的實現方式

有 n 種英雄,CYi 類中就會有 n 個 Attack 成員函數,以及 n 個 FightBack 成員函數。對於其他類也如此。

如果遊戲版本升級,增加了新的英雄寒冰艾希 CAshe,則程序改動較大。所有的類都需要增加兩個成員函數:

這樣工作量是非常大的!!非常的不人性,所以這種設計方式是非常的不好!

— —

 

03  多態的實現方式

用多態的方式去實現,就能得知多態的優勢了,那麼上面的栗子改成多態的方式如下:

如果增加了新的英雄寒冰艾希 CAshe,只需要編寫新類CAshe,不再需要在已有的類裏專門爲新英雄增加:

所以已有的類可以原封不動,那麼使用多態的特性新增英雄的時候,可見改動量是非常少的。

多態使用方式:

根據多態的規則,上面的(1),(2),(3)進入到 CYi::Attack 函數後 

分別調用:

所以要養成好習慣:

● 一個類如果定義了虛函數,則應該將析構函數也定義成虛函數;

● 或者,一個類打算作爲基類使用,也應該將析構函數定義成虛函數。

● 注意:構造函數不能定義成虛構造函數。


對於熱愛編程的人來說,有一羣一起學習一起解惑的小夥伴很重要!

小編有一個C/C++編程學習交流俱樂部,【點擊進入】!

還有編程學習文件(源碼,零基礎教程,項目實戰教學視頻),歡迎初學者和正在進階中的小夥伴們!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章