C 快速入門 10 多型

2021-08-17 01:48:22 字數 1721 閱讀 1622

當子類繼承父類,並且子類重寫了父類的函式的時候,當我們使用父類物件指向子類引用的時候,我們希望呼叫的是子類的函式,而不是父類的函式,如果當父類物件指向自身的時候,我們希望呼叫的是父類自身的函式,而不是子類的函式,這就是c++中的多型,這就意味著,乙個父類可以有多種指向方式,我們完全可以讓多個類繼承於同乙個類,然後重寫其中的某個方法,當我們傳什麼物件時,就預設調什麼物件的方法,這樣講太抽象,我們還是舉例說明

class a 

};class c1 :public a

};class c2 :public a

};int main()

發現輸出結果分別為ccc 1和ccc 2,那麼是不是很方便呢?我們可以用同乙個物件指向不同的子類物件,當我們想要使用這個函式的時候,只需要傳對應的子類物件就可以了。值得注意的是,這裡在父類中需要使用virtual關鍵字。而在子類中的函式前可寫可不寫。

class a 

};class c1 :public a

};class c2 :public a

};void func(a * c)

int main()

從以上可以看出,func函式能夠呼叫你以後寫的任何繼承於a的函式的print方法,這就是多型的威力。這不久等於使用多型就能呼叫未來的類的函式嗎?舉個簡單的例子

class

hero

};class

monster

};class

advhero :hero

};void pk(hero & hero, monster & monster)

else

};int main()

你如果覺得hero還不夠,那麼你完全可以再定義乙個類讓他繼承hero,然後重寫power方法,同樣的能構使用pk方法。

如果你使用了多型,並且需要利用析構函式做某些事情的時候,這時候,預設只會呼叫父類的析構函式,不會再呼叫子類的析構函式

class a 

virtual ~a()

};class c :public a

virtual ~c()

};int main()

解決方案是加virtual關鍵字,同樣的子類可加可不加

class a 

virtual ~a()

virtual

void print()

virtual

void print(int a)

};class c :public a

virtual ~c()

virtual

void print(int a, int b)

};int main()

你想在子類中,過載print()函式,並且自定了兩個引數,但是,你會發現,當你再直接呼叫print()函式的時候,會出現問題,原因出再子類將父類的print函式給覆蓋了,並且沒有儲存print()函式,這樣的話,我們必須新增域作用符號來讓程式合理的呼叫。

C 多型入門

4.過載 覆蓋 隱藏 的對比 5.抽象類 多型是在不同繼承關係的類物件,去呼叫同一函式,產生了不同的行為。比如student繼承了person。person物件買票全價,student物件買票半價。繼承中構成多型的條件 必須通過基類的指標或者引用呼叫虛函式被呼叫的函式必須是虛函式,且派生類必須對基類...

C 入門 多型(二)

c 入門 多型 二 一.簡單工廠設計模式 核心 根據使用者的輸入建立物件賦值給父類 namespace demo 簡單工廠的核心 根據使用者的輸入建立物件賦值給父類 public static notebook getnotebook string brand return nb public ab...

C 快速入門

1.1 呼叫 gnu編譯器的預設命令是 g g prog.cc o prog unix 的 shell視窗 cc prog.cc 標準的輸入與輸出物件 處理輸入時使用的命令 cin cin為 istream型別物件 處理輸出時使用的命令 cout cout為 ostream型別物件 標準庫的另外兩個...