1、 純虛函數(shù):
純虛函數(shù)是一種特殊的虛函數(shù),它的一般格式如下:
class< 類名 >
{
virtual < 類型 >< 函數(shù)名 >(< 參數(shù)表 >)=0;
……
};
一般情況下可將一個(gè)成員函數(shù)在基類中聲明為純虛函數(shù),其實(shí)現(xiàn)在派生類中完成。
例:一個(gè)使用純虛函數(shù)的例子:
#include
class phoneCard
{
public:
virtual bool performDial()=0;
double getBalance()
{
return balance;
}
phoneCard(double ba)
{
balance=ba;
}
protected:
double balance;
};
class none_phoneCard:public phoneCard
{
public:
char *getSetType()
{
return phoneSetType;
}
protected:
char phoneSetType[20];
};
class number_phoneCard:public phoneCard
{
public:
bool performConnection(long cn,int pw)
{
if(cn==cardNumber&&pw==password)
{
connected=true;
return true;
}
else
return false;
}
number_phoneCard(long ca,int pa,char *per,
bool co,double ba):phoneCard(ba)
{
cardNumber=ca;
password=pa;
connectNumber=per;
connected=co;
}
protected:
long cardNumber;
int password;
char* connectNumber;
bool connected;
};
class magCard:public none_phoneCard
{
public:
char usefulArea;
bool performDial()
{
if(balance>0.9)
{
balance-=0.9;
return true;
}
else
return false;
}
};
class IC_card: public none_phoneCard
{
public:
bool performDial()
{
if(balance>0.5)
{
balance-=0.5;
return true;
}
else
return false;
}
};
class IP_card:public number_phoneCard
{
public:
char expireDate[20];
bool performDial()
{
if(balance>0.3&&expireDate>"20011220")
{
balance-=0.3;
return true;
}
else
return false;
}
};
class D200_card :public number_phoneCard
{
public:
double additoryFee;
bool performDial()
{
if(balance>(0.5+additoryFee))
{
balance-=(0.5+additoryFee);
}
else
return false;
}
D200_card(double add=0,long ca=0,int pa=0,
char *con="00000000",bool connected=false,
double ba=0):number_phoneCard(ca,pa,con,connected,ba)
{
additoryFee=add;
}
};
void main()
{
D200_card obj1(0,163,1234567,"163",false,50);
cout<
obj1.performDial();
cout<
}
運(yùn)行結(jié)果:
50
49.5
學(xué)員可自行分析一下該程序中的類之間的繼承關(guān)系。
2、抽象類:
抽象類是一種特殊的類,它是為了抽象和設(shè)計(jì)的目的為建立的,它處于繼承層次結(jié)構(gòu)的較上層。
⑴抽象類的定義:
稱帶有純虛函數(shù)的類為抽象類。
⑵抽象類的作用:
抽象類的主要作用是將有關(guān)的操作作為結(jié)果接口組織在一個(gè)繼承層次結(jié)構(gòu)中,由它來(lái)為派生類提供一個(gè)公共的根,派生類將具體實(shí)現(xiàn)在其基類中作為接口的操作。所以派生類實(shí)際上刻畫了一組子類的操作接口的通用語(yǔ)義,這些語(yǔ)義也傳給子類,子類可以具體實(shí)現(xiàn)這些語(yǔ)義,也可以再將這些語(yǔ)義傳給自己的子類。
(3)使用抽象類時(shí)注意:
• 抽象類只能作為基類來(lái)使用,其純虛函數(shù)的實(shí)現(xiàn)由派生類給出。如果派生類中沒(méi)有重新定義純虛函數(shù),而只是繼承基類的純虛函數(shù),則這個(gè)派生類仍然還是一個(gè)抽象類。如果派生類中給出了基類純虛函數(shù)的實(shí)現(xiàn),則該派生類就不再是抽象類了,它是一個(gè)可以建立對(duì)象的具體的類。
• 抽象類是不能定義對(duì)象的。
如上例中, phoneCard,none_phoneCard,number_phoneCard 等就是抽象類,不能為其建立對(duì)象。而 magCard,IC_card,IP_card,D200_card 等實(shí)現(xiàn)了純虛函數(shù) performDial() ,從而是具體的類,可以建立對(duì)象。
純虛函數(shù)是一種特殊的虛函數(shù),它的一般格式如下:
class< 類名 >
{
virtual < 類型 >< 函數(shù)名 >(< 參數(shù)表 >)=0;
……
};
一般情況下可將一個(gè)成員函數(shù)在基類中聲明為純虛函數(shù),其實(shí)現(xiàn)在派生類中完成。
例:一個(gè)使用純虛函數(shù)的例子:
#include
class phoneCard
{
public:
virtual bool performDial()=0;
double getBalance()
{
return balance;
}
phoneCard(double ba)
{
balance=ba;
}
protected:
double balance;
};
class none_phoneCard:public phoneCard
{
public:
char *getSetType()
{
return phoneSetType;
}
protected:
char phoneSetType[20];
};
class number_phoneCard:public phoneCard
{
public:
bool performConnection(long cn,int pw)
{
if(cn==cardNumber&&pw==password)
{
connected=true;
return true;
}
else
return false;
}
number_phoneCard(long ca,int pa,char *per,
bool co,double ba):phoneCard(ba)
{
cardNumber=ca;
password=pa;
connectNumber=per;
connected=co;
}
protected:
long cardNumber;
int password;
char* connectNumber;
bool connected;
};
class magCard:public none_phoneCard
{
public:
char usefulArea;
bool performDial()
{
if(balance>0.9)
{
balance-=0.9;
return true;
}
else
return false;
}
};
class IC_card: public none_phoneCard
{
public:
bool performDial()
{
if(balance>0.5)
{
balance-=0.5;
return true;
}
else
return false;
}
};
class IP_card:public number_phoneCard
{
public:
char expireDate[20];
bool performDial()
{
if(balance>0.3&&expireDate>"20011220")
{
balance-=0.3;
return true;
}
else
return false;
}
};
class D200_card :public number_phoneCard
{
public:
double additoryFee;
bool performDial()
{
if(balance>(0.5+additoryFee))
{
balance-=(0.5+additoryFee);
}
else
return false;
}
D200_card(double add=0,long ca=0,int pa=0,
char *con="00000000",bool connected=false,
double ba=0):number_phoneCard(ca,pa,con,connected,ba)
{
additoryFee=add;
}
};
void main()
{
D200_card obj1(0,163,1234567,"163",false,50);
cout<
obj1.performDial();
cout<
}
運(yùn)行結(jié)果:
50
49.5
學(xué)員可自行分析一下該程序中的類之間的繼承關(guān)系。
2、抽象類:
抽象類是一種特殊的類,它是為了抽象和設(shè)計(jì)的目的為建立的,它處于繼承層次結(jié)構(gòu)的較上層。
⑴抽象類的定義:
稱帶有純虛函數(shù)的類為抽象類。
⑵抽象類的作用:
抽象類的主要作用是將有關(guān)的操作作為結(jié)果接口組織在一個(gè)繼承層次結(jié)構(gòu)中,由它來(lái)為派生類提供一個(gè)公共的根,派生類將具體實(shí)現(xiàn)在其基類中作為接口的操作。所以派生類實(shí)際上刻畫了一組子類的操作接口的通用語(yǔ)義,這些語(yǔ)義也傳給子類,子類可以具體實(shí)現(xiàn)這些語(yǔ)義,也可以再將這些語(yǔ)義傳給自己的子類。
(3)使用抽象類時(shí)注意:
• 抽象類只能作為基類來(lái)使用,其純虛函數(shù)的實(shí)現(xiàn)由派生類給出。如果派生類中沒(méi)有重新定義純虛函數(shù),而只是繼承基類的純虛函數(shù),則這個(gè)派生類仍然還是一個(gè)抽象類。如果派生類中給出了基類純虛函數(shù)的實(shí)現(xiàn),則該派生類就不再是抽象類了,它是一個(gè)可以建立對(duì)象的具體的類。
• 抽象類是不能定義對(duì)象的。
如上例中, phoneCard,none_phoneCard,number_phoneCard 等就是抽象類,不能為其建立對(duì)象。而 magCard,IC_card,IP_card,D200_card 等實(shí)現(xiàn)了純虛函數(shù) performDial() ,從而是具體的類,可以建立對(duì)象。