1. 多態(tài)的概念
面向?qū)ο笾衅谕男袨椋?strong>根據(jù)實(shí)際的對(duì)象類型判斷如何調(diào)用重寫(xiě)函數(shù)。
- 如果父類指針(引用)指向父類對(duì)象,則調(diào)用父類中定義的函數(shù);
- 如果父類指針(引用)指向子類對(duì)象,則調(diào)用子類中定義的重寫(xiě)函數(shù)。
面向?qū)ο笾?strong>多態(tài)的概念:根據(jù)實(shí)際的對(duì)象類型決定函數(shù)調(diào)用的具體目標(biāo),同樣的調(diào)用語(yǔ)句在實(shí)際運(yùn)行時(shí)有多種不同的表現(xiàn)形式。
C++語(yǔ)言直接支持多態(tài)的概念:
- 通過(guò)使用
virtual關(guān)鍵字對(duì)多態(tài)進(jìn)行支持 - 被
virtual聲明的函數(shù)被重寫(xiě)后具有多態(tài)特征 - 被
virtual聲明的函數(shù)叫做虛函數(shù)
編程說(shuō)明:多態(tài)的初探
#include <iostream>
#include <string>
using namespace std;
class Parent
{
public:
virtual void print() // add virtual keyword ==> polymorphism
{
cout << "I'm Parent." << endl;
}
};
class Child : public Parent
{
public:
void print()
{
cout << "I'm Child." << endl;
}
};
void how_to_print(Parent* p)
{
p->print(); // 展現(xiàn)多態(tài)的行為
}
int main()
{
Parent p;
Child c;
how_to_print(&p); // Expected to print : I'm Parent.
how_to_print(&c); // Expected to print : I'm Child.
return 0;
}
輸出結(jié)果:
I'm Parent.
I'm Child.
2. 多態(tài)的意義
- 在程序運(yùn)行過(guò)程中展現(xiàn)出動(dòng)態(tài)的特性
- 函數(shù)重寫(xiě)必須多態(tài)實(shí)現(xiàn),否則沒(méi)有意義
- 多態(tài)是面向?qū)ο蠼M件化程序設(shè)計(jì)的基礎(chǔ)特性
3. 靜態(tài)聯(lián)編(static binding)和動(dòng)態(tài)聯(lián)編(dynamic binding)
靜態(tài)聯(lián)編:在程序的編譯期間就能確定具體的函數(shù)調(diào)用,如函數(shù)重載
動(dòng)態(tài)聯(lián)編:在程序實(shí)際運(yùn)行后才能確定具體的函數(shù)調(diào)用,如函數(shù)重寫(xiě)
編程說(shuō)明:動(dòng)態(tài)聯(lián)編和靜態(tài)聯(lián)編
#include <iostream>
#include <string>
using namespace std;
class Parent
{
public:
virtual void func()
{
cout << "void func() " << endl;
}
virtual void func(int i)
{
cout << "void func(int i): " << i<< endl;
}
virtual void func(int i, int j)
{
cout << "void func(int i, int j): " << "(" << i << ", " << j << ")" << endl;
}
};
class Child : public Parent
{
public:
void func(int i, int j)
{
cout << "void func(int i, int j): " << i + j << endl;
}
void func(int i, int j, int k)
{
cout << "void func(int i, int j, int k): " << i + j + k << endl;
}
};
void run(Parent* p)
{
p->func(1, 2); // dynamic binding
}
int main()
{
Parent p;
p.func(); // static binding
p.func(1); // static binding
p.func(1, 2); // static binding
cout << endl;
Child c;
c.func(1, 2); // static binding
cout << endl;
run(&p);
run(&c);
return 0;
}
輸出結(jié)果:
void func()
void func(int i): 1
void func(int i, int j): (1, 2)
void func(int i, int j): 3
void func(int i, int j): (1, 2)
void func(int i, int j): 3
4. 小結(jié)
- 函數(shù)重寫(xiě)只可能發(fā)生在父類和子類之間
- 根據(jù)實(shí)際對(duì)象的類型確定調(diào)用的具體函數(shù)
-
virtual關(guān)鍵字是C++中支持多態(tài)的唯一方式 - 被重寫(xiě)的虛函數(shù)可以表現(xiàn)出多態(tài)的特性
