C++編譯期多態(tài)與運(yùn)行期多態(tài)
來源:https://www.cnblogs.com/QG-whz/p/5132745.html
前言
什么是運(yùn)行期多態(tài) 什么是編譯期多態(tài) 它們的優(yōu)缺點(diǎn)在哪
運(yùn)行期多態(tài)

class Animal
{
public :
virtual void shout() = 0;
};
class Dog :public Animal
{
public:
virtual void shout(){ cout << "汪汪!"<<endl; }
};
class Cat :public Animal
{
public:
virtual void shout(){ cout << "喵喵~"<<endl; }
};
class Bird : public Animal
{
public:
virtual void shout(){ cout << "嘰喳!"<<endl; }
};
int main()
{
Animal * anim1 = new Dog;
Animal * anim2 = new Cat;
Animal * anim3 = new Bird;
//藉由指針(或引用)調(diào)用的接口,在運(yùn)行期確定指針(或引用)所指對(duì)象的真正類型,調(diào)用該類型對(duì)應(yīng)的接口
anim1->shout();
anim2->shout();
anim3->shout();
//delete 對(duì)象
...
return 0;
}
//我們有個(gè)動(dòng)物園,里面有一堆動(dòng)物
int main()
{
vector<Animal*>anims;
Animal * anim1 = new Dog;
Animal * anim2 = new Cat;
Animal * anim3 = new Bird;
Animal * anim4 = new Dog;
Animal * anim5 = new Cat;
Animal * anim6 = new Bird;
//處理異質(zhì)類集合
anims.push_back(anim1);
anims.push_back(anim2);
anims.push_back(anim3);
anims.push_back(anim4);
anims.push_back(anim5);
anims.push_back(anim6);
for (auto & i : anims)
{
i->shout();
}
//delete對(duì)象
//...
return 0;
}
編譯期多態(tài)
相比較于運(yùn)行期多態(tài),實(shí)現(xiàn)編譯期多態(tài)的類之間并不需要成為一個(gè)繼承體系,它們之間可以沒有什么關(guān)系,但約束是它們都有相同的隱式接口。我們將上面的例子改寫為:
class Animal
{
public :
void shout() { cout << "發(fā)出動(dòng)物的叫聲" << endl; };
};
class Dog
{
public:
void shout(){ cout << "汪汪!"<<endl; }
};
class Cat
{
public:
void shout(){ cout << "喵喵~"<<endl; }
};
class Bird
{
public:
void shout(){ cout << "嘰喳!"<<endl; }
};
template <typename T>
void animalShout(T & t)
{
t.shout();
}
int main()
{
Animal anim;
Dog dog;
Cat cat;
Bird bird;
animalShout(anim);
animalShout(dog);
animalShout(cat);
animalShout(bird);
getchar();
}
運(yùn)行期多態(tài)與編譯期多態(tài)優(yōu)缺點(diǎn)分析
運(yùn)行期多態(tài)優(yōu)點(diǎn)
OO設(shè)計(jì)中重要的特性,對(duì)客觀世界直覺認(rèn)識(shí)。 能夠處理同一個(gè)繼承體系下的異質(zhì)類集合。
運(yùn)行期多態(tài)缺點(diǎn)
運(yùn)行期間進(jìn)行虛函數(shù)綁定,提高了程序運(yùn)行開銷。 龐大的類繼承層次,對(duì)接口的修改易影響類繼承層次。 由于虛函數(shù)在運(yùn)行期在確定,所以編譯器無法對(duì)虛函數(shù)進(jìn)行優(yōu)化。
編譯期多態(tài)優(yōu)點(diǎn)
它帶來了泛型編程的概念,使得C++擁有泛型編程與STL這樣的強(qiáng)大武器。 在編譯器完成多態(tài),提高運(yùn)行期效率。 具有很強(qiáng)的適配性與松耦合性,對(duì)于特殊類型可由模板偏特化、全特化來處理。
編譯期多態(tài)缺點(diǎn)
程序可讀性降低,代碼調(diào)試帶來困難。 無法實(shí)現(xiàn)模板的分離編譯,當(dāng)工程很大時(shí),編譯時(shí)間不可小覷。 無法處理異質(zhì)對(duì)象集合。
關(guān)于顯式接口與隱式接口
void AnimalShot(Animal & anim)
{
anim.shout();
}
template <typename T>
void AnimalShot(T & anim)
{
anim.shout();
}
評(píng)論
圖片
表情
