純虛類有以下特徵:
含有一個純虛函數的類,叫做純虛類。純虛類不可以定義對象。
我個人覺得這個說法應該就是把純虛類的主要特點說明了:
1、只要有一個純虛函數。就稱為純虛類。
所以如果子類沒有實現純虛函數,相當子類也有純虛函數,所以子類也是純虛類。
2、其他類的定義與使用方式都與一般的類差不多。大致有如下地方:
純虛類可以有成員變數 (可以)
純虛類可以有普通的成員函數(可以)
純虛類可不可以有其他虛函數(可以)
純虛類可不可以又帶有參數的建構函式? (可以)
可不可以在純虛類的衍生類別的建構函式中顯式調用純虛類的帶參數建構函式(可以)
3、使用方式上:不可以定義一個對象。
下面是另外一篇文章中說的說法:(純虛類也稱為抽象類別)
帶有純虛函數的類稱為抽象類別。抽象類別是一種特殊的類,它是為了抽象和設計的目的而建立的,它處於繼承階層的較上層(而不是絕對的上層,也有可能是中層,甚至底層?)。抽象類別是不能定義對象的,在實際中為了強調一個類是抽象類別,可將該類的建構函式(設定為protected)說明為保護的存取控制許可權。
抽象類別的主要作用是將有關的組織在一個繼承階層中,由它來為它們提供一個公用的根(其實不一定是根),相關的子類是從這個根派生出來的。
抽象類別刻畫了一組子類的操作介面的通用語義,這些語義也傳給子類。一般而言,抽象類別只描述這組子類共同的操作介面,而完整的實現留給子類。
抽象類別只能作為基類來使用(大多數情況是其他類的基類,但是抽象類別本身也有可能是子類),其純虛函數的實現由衍生類別給出。如果衍生類別沒有重新定義純虛函數,而衍生類別只是繼承基類的純虛函數,則這個衍生類別仍然還是一個抽象類別。如果衍生類別中給出了基類純虛函數的實現,則該衍生類別就不再是抽象類別了,它是一個可以建立對象的具體類了。
4、純虛類一般是做為介面使用(這裡要好好看設計模式了)
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
usingnamespacestd;
classbase
{
protected:
base(){}
virtualvoid eat(conststringname) =0;
};
classdog:publicbase
{
public:
vector<string>m_food;
voideat(conststringname);
voidpush_back(conststringname);
};
voiddog::eat(conststringname)
{
vector<string>::iteratoriter=std::find(m_food.begin(),m_food.end(),name);
if (m_food.end() !=iter)
{
cout<<"Dog eat "<<*iter<<endl;
}
}
voiddog::push_back(conststringname)
{
if (m_food.end() ==std::find(m_food.begin(),m_food.end(),name))
{
m_food.push_back(name);
}
}
intmain(void)
{
dogd;
d.push_back("bone");
d.eat("bone");
return0;
}