静态多态 动态多态
一. 靜態多態
1. 何為靜態多態?
又稱編譯期多態,即在系統編譯期間就可以確定程序將要執行哪個函數。例如:函數重載,通過類成員運算符指定的運算。
2. 示例代碼
函數重載示例:
class A { public:A() {}A( int x ) {}void f() {}void f( int x ) {} };class B { public:B() {}void f() {}void f( int x ) {} };以上,類A中兩個A()是函數重載,兩個f()是函數重載,類B同理。
二. 動態多態
1. 何為動態多態?
動態多態是利用虛函數實現運行時的多態,即在系統編譯的時候并不知道程序將要調用哪一個函數,只有在運行到這里的時候才能確定接下來會跳轉到哪一個函數。
動態多態是在虛函數的基礎上實現的,而實現的條件有:
(1) 在類中聲明為虛函數
(2) 函數的函數名,返回值,函數參數個數,參數類型,全都與基類的所聲明的虛函數相同(否則是函數重載的條件)
(3) 將子類對象的指針(或以引用形式)賦值給父類對象的指針(或引用),再用該指向父類對象的指針(或引用)調用虛函數
如此,便可以實現動態多態,程序會按照實際對象類型來選擇要實行的函數具體時哪一個。
2. 示例代碼
(1) 非多態
#include <iostream> using namespace std;class A { public:A() {}void f() { cout << "A::f() is called.\n"; } };class B : public A { public:B() {}void f() { cout << "B::f() is called.\n"; } };int main() {A a;B b;A *p1 = &a;A *p2 = &b;p1->f();p2->f();return 0; }運行結果
A::f() is called. A::f() is called.在這種情況下,我們會發現程序的輸出結果并不是我們想要的,而是兩次調用的f()函數都是基類的。這是因為使用的是基類指針,而且基類中沒有將f()聲明為虛函數,所以每次調用都會使用基類的方法。
(2)多態
#include <iostream> using namespace std;class A { public:A() {}virtual void f() { cout << "A::f() is called.\n"; } };class B : public A { public:B() {}virtual void f() { cout << "B::f() is called.\n"; } };int main() {A a;B b;A *p1 = &a;A *p2 = &b;p1->f();p2->f();return 0; }運行結果
A::f() is called. B::f() is called.這樣,也就實現了動態多態,程序可以按照我們期望的方式正確輸出。
三. 總結
建議在基類中,如果含有虛函數,就將類的析構函數聲明為虛析構函數,以避免在調用時發生錯誤。
總結
- 上一篇: 江南百景图羽扇是谁的珍宝
- 下一篇: 做试管婴儿需请假几天