1. 動態綁定與靜態多態java
經過對對象的請求以及該對象的本類型定義的不一樣定義到不一樣的實現。便是程序的行爲是在運行的最後時刻才被肯定。c++
這即是面向對象系統中的多態概念,c++中有幾種多態體現,包括模版化與參數多態。以及這裏的動態綁定。算法
模版化與參數多態又被稱爲靜態多態。模版化是c++中泛型編程的體現之一,是c++的利器,在stl中大量充斥着模版化的例子。stl中的算法一類所有都是使用模版化的技術。編程
2. 抽象類與具體類c#
抽象類把它的部分或是所有操做的實現都延遲到子類,子類可以重寫(override)父類的操做,繼承這個機制自己可以容許你很方便的拓展出新類,從而獲得同一系列的對象族。以下圖所示,AbstractClass就是一個抽象類,它的Operation操做是未被定義的抽象操做,ConcreteSubclass自己是一個具體類,它屬於AbstractClass子類,重寫(override)了父類的相關Operation操做。ide
3. 混入類(mixin class)函數
混入類既是c++中的多重繼承的類,c++沒有像java、c#同樣規定單根繼承,因此對於一個具體類,它能夠是n個抽象類的子類。從而能夠繼承了n個抽象類的特性。舉例來講, 蝙蝠既是哺乳動物也是能飛的生物,因此它具有了這兩類生物的全部特性,這裏的class Bat就是混入類。工具
class Mammal
{指針
public:
virtual void Breathe();
};對象
class FlyCreature
{
public:
virtual void Fly();
};
class Bat :public Mammal, public FlyCreature
{
public:
void Breathe()
{
//Breathe with lung
}
void Fly()
{
// fly with wing
}
};
4. 類繼承與接口繼承
c++裏沒有明確區分類繼承與接口繼承,通常來講繼承有一個純虛函數的抽象類就是接口繼承,其餘則爲類繼承。
java與c#有明確的界定,全部的繼承都是類繼承,全部implement關鍵字限定的繼承就是接口繼承。
5. 繼承與組合
這兩個概念都是爲了一個目的,複用已有代碼。繼承對於子類來講父類的實現都是可見的,因此這種方式又被稱爲白箱複用。舉例來講,經過類Bat生成的對象能夠直接使用FlyCreature的成員函數,可是父類FlyCreature對於子類Bat來講是可被重寫(override)的,因此Bat對FlyCreature 的複用就是屬於白箱複用。
class Mammal
{
public:
virtual void Breathe();
};
class FlyCreature
{
public:
void Fly()
{
//fly With Wing
}
};
class Bat :public Mammal, public FlyCreature
{
public:
void Breathe()
{
//Brea with lung
}
};
而對於組合來講,工具類的使用只能經過該類暴露出來的成員函數,因此這類複用又被稱爲黑箱複用。舉例來講Bat經過對象obj實現了Fly的動做,FlyCreature類對Bat來講是不可重寫(override)的,因此Bat對FlyCreature的複用就屬於黑箱複用。
class Mammal
{
virtual void Breathe();
};
class FlyCreature
{
void Fly()
{
//fly with wing
}
};
class Bat :public Mammal
{
void Breathe()
{
//Breathe with lung
}
void FlyWithWing()
{
FlyCreature obj;
obj.FlyWithWing();
}
};
6. 委託與c++的impl慣用法
委託其實是組合的一種體現形式,在c++中經過傳遞一個工具類的指針來使用工具類的功能。這種代碼複用方式被稱爲委託。
impl慣用法可用來實現委託,它是c++的經常使用技巧之一。在c++中,對於一個客戶類來講它須要的只是一個工具類的指針與申明,對於實現的詳細信息它並不用關注。因此咱們常常可使用一個對象指針或引用來代替一個對象,在另外的cpp中實現該對象的類。這樣從物理分佈上隔離了實現與抽象,既達到了對客戶隱藏實現的目的,又能夠受益於動態綁定或是類型檢測給程序帶來的好處。同時對於一個指針或是引用來講拷貝它自己代價是及其小的,在一些效率要求較高的程序來講,傳遞此類變量的受益是及其大的。