抽象類
抽象類的一般形式
帶有純虛函數的類稱為抽象類:
class? 類名
{
virtual 類型 函數名(參數表)=0;
//純虛函數
...
}
注意:
抽象類只能作為基類來使用。
不能聲明抽象類的對象,只能聲明抽象類的指針。
純虛函數直到被覆蓋前所派生的類均為抽象類
抽象類的作用
抽象類為抽象和設計的目的而建立,將有關的數據和行為組織在一個繼承層次結構中,保證派生類具有要求的行為。
對于暫時無法實現的函數,可以聲明為純虛函數,留給派生類去實現。
使用純虛函數時應注意:
(1)抽象類中可以有多個純虛函數。
(2)抽象類也可以定義其他非純虛函數。
(3)從抽象類可以派生出具體或抽象類,但不能從具體類派生出抽象類。
問題:抽象類需要有構造函數和析構函數嗎?
抽象類通常代表一個抽象的概念,它提供一個繼承的出發點。
在一個復雜的類繼承結構中,越上層的類抽象程度越高,有時甚至無法給出某些成員函數的實現,顯然,抽象類是一種特殊的類,它一般處于類繼承結構的較外層。
引入抽象類的目的,主要是為了能將相關類組織在一個類繼承結構中,并通過抽象類來為這些相關類提供統一的操作接口,更好的發揮多態性。
抽象類使得數據結構更加清晰,更加貼近自然
拷貝構造函數
對象的賦值:
class Student{
string name;
public:
Student(char* pName=“”){
name=pName;
}
};
Student a("jenny");
Student b;
b=a;
一個已知對象賦值給另一個已知對象。
通過對賦值運算符的重載實現的。
對象的復制(拷貝):用一個已知對象構造(初始化)一個新對象。
例:一個已知對象構造(初始化)另一對象
Student s1(“Jenny”);
Student s2=s1;即Student s2(s1);
Student fn(Student s){Student k;//.......? ;return k}
void main()
{Student m,n;n=fn(m);}
使用Student (char*? )不再合適,引入新的構造函數——拷貝構造函數:
Student (Student& s);或者是Student ( const Student& s);