純虛函數是一種特殊的虛函數,它的一般格式如下:
class <類名>
{
virtual <類型><函數名>(<參數表>)=0;
…
};
在許多情況下,在基類中不能對虛函數給出有意義有實現,而把它說明爲純虛函數,它的實現留給該基類的派生類去做。這就是純虛函數的作用。下面給出一個純虛函數的例子。
#include
class point
{
public:
point(int i=0, int j=0) { x0=i; y0=j; }
virtual void set() = 0;
virtual void draw() = 0;
protected:
int x0, y0;
};
class line : public point
{
public:
line(int i=0, int j=0, int m=0, int n=0):point(i, j)
{
x1=m; y1=n;
}
void set() { cout<<"line::set() called./n"; }
void draw() { cout<<"line::draw() called./n"; }
protected:
int x1, y1;
};
class ellipse : public point
{
public:
ellipse(int i=0, int j=0, int p=0, int q=0):point(i, j)
{
x2=p; y2=q;
}
void set() { cout<<"ellipse::set() called./n"; }
void draw() { cout<<"ellipse::draw() called./n"; }
protected:
int x2, y2;
};
void drawobj(point *p)
{
p->draw();
}
void setobj(point *p)
{
p->set();
}
void main()
{
line *lineobj = new line;
ellipse *elliobj = new ellipse;
drawobj(lineobj);
drawobj(elliobj);
cout< setobj(lineobj);
setobj(elliobj);
cout<<"/nRedraw the object.../n";
drawobj(lineobj);
drawobj(elliobj);
}
抽象類
帶有純虛函數的類稱爲抽象類。抽象類是一種特殊的類,它是爲了抽象和設計的目的而建立的,它處於繼承層次結構的較上層。抽象類是不能定義對象的,在實際中爲了強調一個類是抽象類,可將該類的構造函數說明爲保護的訪問控制權限。
抽象類的主要作用是將有關的組織在一個繼承層次結構中,由它來爲它們提供一個公共的根,相關的子類是從這個根派生出來的。
抽象類刻畫了一組子類的操作接口的通用語義,這些語義也傳給子類。一般而言,抽象類只描述這組子類共同的操作接口,而完整的實現留給子類。
抽象類只能作爲基類來使用,其純虛函數的實現由派生類給出。如果派生類沒有重新定義純虛函數,而派生類只是繼承基類的純虛函數,則這個派生類仍然還是一個抽象類。如果派生類中給出了基類純虛函數的實現,則該派生類就不再是抽象類了,它是一個可以建立對象的具體類了。