你說(shuō)的是c++的抽象類
我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、云州ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的云州網(wǎng)站制作公司
純虛函數(shù)和抽象類
純虛函數(shù)是一種特殊的虛函數(shù),它的一般格式如下:
class 類名
{
virtual 類型函數(shù)名(參數(shù)表)=0;
…
};
在許多情況下,在基類中不能對(duì)虛函數(shù)給出有意義有實(shí)現(xiàn),而把它說(shuō)明為純虛函數(shù),它的實(shí)現(xiàn)留給該基類的派生類去做。這就是純虛函數(shù)的作用。下面給出一個(gè)純虛函數(shù)的例子。
#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);
}
抽象類
帶有純虛函數(shù)的類稱為抽象類。抽象類是一種特殊的類,它是為了抽象和設(shè)計(jì)的目的而建立的,它處于繼承層次結(jié)構(gòu)的較上層。抽象類是不能定義對(duì)象的,在實(shí)際中為了強(qiáng)調(diào)一個(gè)類是抽象類,可將該類的構(gòu)造函數(shù)說(shuō)明為保護(hù)的訪問(wèn)控制權(quán)限。
抽象類的主要作用是將有關(guān)的組織在一個(gè)繼承層次結(jié)構(gòu)中,由它來(lái)為它們提供一個(gè)公共的根,相關(guān)的子類是從這個(gè)根派生出來(lái)的。
抽象類刻畫(huà)了一組子類的操作接口的通用語(yǔ)義,這些語(yǔ)義也傳給子類。一般而言,抽象類只描述這組子類共同的操作接口,而完整的實(shí)現(xiàn)留給子類。
抽象類只能作為基類來(lái)使用,其純虛函數(shù)的實(shí)現(xiàn)由派生類給出。如果派生類沒(méi)有重新定義純虛函數(shù),而派生類只是繼承基類的純虛函數(shù),則這個(gè)派生類仍然還是一個(gè)抽象類。如果派生類中給出了基類純虛函數(shù)的實(shí)現(xiàn),則該派生類就不再是抽象類了,它是一個(gè)可以建立對(duì)象的具體類了。
首先一定從最簡(jiǎn)單程序Hello World開(kāi)始
然后是數(shù)據(jù)類型、標(biāo)識(shí)符、運(yùn)算符、表達(dá)式、常量和變量(這些都是最基礎(chǔ)的了)
接著會(huì)講一些算法流程
接下來(lái)就是系統(tǒng)的學(xué)習(xí)C編程,需要涉及的內(nèi)容有:
完整的輸入輸出
順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)(包括中斷和繼續(xù))
函數(shù)的定義和使用
數(shù)組及順序表
指針與地址
結(jié)構(gòu)體與共用體
數(shù)據(jù)結(jié)構(gòu)(包括鏈表、棧與隊(duì)列、樹(shù)、圖等)
學(xué)完這些之后就可以學(xué)C++了,C++主要涉及的內(nèi)容如下:
引用和內(nèi)聯(lián)函數(shù)的使用
類與對(duì)象(及訪問(wèn)權(quán)限)
構(gòu)造函數(shù)與析構(gòu)函數(shù)
繼承和多態(tài)
純虛函數(shù)與抽象類
運(yùn)算符重載
靜態(tài)成員和友元
C++高級(jí)編程主要包括
STL模板(集合類)
UC高級(jí)編程和QT編程(Linux/Unix方向)
Windows內(nèi)核編程和MFC(Windows方向)
訪問(wèn)數(shù)據(jù)庫(kù)(數(shù)據(jù)庫(kù)軟件一般使用甲骨文,也有用SQL Server的)
#include "stdio.h"
main()
{
float a,b,c,p;
loop1:
printf("please enter pianshang a:\n");
scanf("%f",a);
printf("please enter pianshang b:\n");
scanf("%f",b);
printf("please enter pianshang c:\n");
scanf("%f",c);
if(a+b=c||a+c=b||b+c=a)
{
printf("error! please check again and enter three number:");
goto loop1;
}
p=a+b+c;
printf("%f",p);
getch();
}
其實(shí)只能是一個(gè)函數(shù),不能兩個(gè)兼顧.
多態(tài)性是指用一個(gè)名字定義不同的函數(shù),這函數(shù)執(zhí)行不同但又類似的操作,從而實(shí)現(xiàn)“一個(gè)接口,多種方法”。
多態(tài)性的實(shí)現(xiàn)與靜態(tài)聯(lián)編、動(dòng)態(tài)聯(lián)編有關(guān)。靜態(tài)聯(lián)編支持的多態(tài)性稱為編譯時(shí)的多態(tài)性,也稱靜態(tài)多態(tài)性,它是通過(guò)函數(shù)重載和運(yùn)算符重載實(shí)現(xiàn)的。動(dòng)態(tài)聯(lián)編支持的多態(tài)性稱為運(yùn)行時(shí)的多態(tài)性,也稱動(dòng)態(tài)多態(tài)性,它是通過(guò)繼承和虛函數(shù)實(shí)現(xiàn)的。
2.函數(shù)重載
函數(shù)重載的意義在于他能用同一個(gè)名字訪問(wèn)一組相關(guān)的函數(shù)。
在類中普通成員函數(shù)和構(gòu)造函數(shù)都可以重載,特別是構(gòu)造函數(shù)的重載(他提供了多種初使化方式)給用戶更大的靈活性。在基類和派生類的函數(shù)重載有兩種情況:一種是參數(shù)有所差別的重載。另一種是參數(shù)沒(méi)有差別的重載,只是他們屬于不同的類。
可以用以下兩種方法來(lái)區(qū)分這兩種函數(shù):用對(duì)象名加以區(qū)分;使用“類名::”加以區(qū)分。
3.運(yùn)算符重載稱動(dòng)態(tài)多態(tài)性,他是通過(guò)繼承和虛函數(shù)實(shí)現(xiàn)的。
運(yùn)算符重載通過(guò)創(chuàng)建運(yùn)算符函數(shù)operator@()來(lái)實(shí)現(xiàn)。運(yùn)算符函數(shù)定義了重載的運(yùn)算符將要進(jìn)行的操作,這種操作通常作用在一個(gè)類上。這樣,在編譯時(shí)遇到名為operator@的運(yùn)算符函數(shù)(@表示所要重載的運(yùn)算符),就檢查傳遞給函數(shù)的參數(shù)的類型。
重載運(yùn)算符與預(yù)定義運(yùn)算符的使用方法完全相同,它不能改變?cè)羞\(yùn)算符的參數(shù)個(gè)數(shù)(單目或雙目),也不能改變?cè)械膬?yōu)先級(jí)的結(jié)合性。用戶不能定義新的運(yùn)算符,只能從C++已有的運(yùn)算符中選擇一個(gè)恰當(dāng)?shù)倪\(yùn)算符重載。
3.1成員運(yùn)算符函數(shù)
運(yùn)算符函數(shù)可以定義為它將要操作的類的成員(稱為成員運(yùn)算符函數(shù)),也可以定義為非類的成員,但是非成員的運(yùn)算符函數(shù)大多是類的友元函數(shù)(稱為友元運(yùn)算符函數(shù))。
成員運(yùn)算符函數(shù)在類中的聲明格式為:
class X{
//……
type operator@(參數(shù)表);
};
其中type為函數(shù)的返回類型,@為所要重載的運(yùn)算符符號(hào),X是重載此運(yùn)算符的類名,參數(shù)表中羅列的是該運(yùn)算符所需要的操作數(shù)。
成員運(yùn)算符函數(shù)定義的形式一般為:
type X::operator@(參數(shù)表)
//函數(shù)體}
其符號(hào)的含義與聲明時(shí)相同。
在成員運(yùn)算符函數(shù)的參數(shù)表中,若運(yùn)算符是單目的,則參數(shù)表為空,此時(shí)當(dāng)前對(duì)象作為運(yùn)算符的一個(gè)操作數(shù),通過(guò)this指針隱含地傳遞給函數(shù)的;若運(yùn)算符是雙目的,則參數(shù)表中有一個(gè)操作數(shù),它作為運(yùn)算符的右操作參數(shù),此時(shí)當(dāng)前對(duì)象做為運(yùn)算符的左操作數(shù),它是this指針隱含地傳遞給函數(shù)的??傊蓡T運(yùn)算符函數(shù)operator@所需要的一個(gè)操作數(shù)是由對(duì)象通過(guò)this指針隱含傳遞。
3.2友元運(yùn)算符函數(shù)
在C++中可以把運(yùn)算符函數(shù)定義成某個(gè)類的友元函數(shù),稱為友元運(yùn)算符函數(shù)。
友元運(yùn)算符函數(shù)在類的內(nèi)部聲明格式如下:
friend type operator@(參數(shù)表)
定義友元運(yùn)算符函數(shù)格式如下:
type operator@(參數(shù)表)
{ //函數(shù)體
}
與成員運(yùn)算符函數(shù)不同,友元運(yùn)算符函數(shù)是不屬于任何類對(duì)象的,它沒(méi)有this指針。若重載的是雙目運(yùn)算符,則參數(shù)表中有兩個(gè)操作數(shù);若重載的是單目運(yùn)算符,則參數(shù)表中只有一個(gè)操作數(shù)。 不能用友元函數(shù)重載的運(yùn)算符是=、()、[]、-〉,其余的運(yùn)算符都可以使用友元函數(shù)來(lái)實(shí)現(xiàn)重載。
運(yùn)算符函數(shù)調(diào)用形式如下表:
運(yùn)算符函數(shù)調(diào)用形式
習(xí)慣形式 友元運(yùn)算符函數(shù)調(diào)用形式 成員運(yùn)算符函數(shù)調(diào)用形式
a+b operator(a,b) a.operator+(b)
-a operator-(a) a.operator-()
a++ operator++(a,0) a.operator++(0)
4.賦值運(yùn)算符
繼承C語(yǔ)言,用戶自定義的類和結(jié)構(gòu)都要能進(jìn)行賦值運(yùn)算。而數(shù)組名不能賦值,數(shù)組名實(shí)質(zhì)上是一個(gè)常量指針。
對(duì)于任何類,C++提供了默認(rèn)的賦值運(yùn)算符。一般地,默認(rèn)的賦值運(yùn)算符重載是能夠勝任工作的。當(dāng)類中有指針類型時(shí),需要自定義賦值運(yùn)算符函數(shù)。一般其函數(shù)體包含兩部分:
1)與析構(gòu)函數(shù)類似,取消對(duì)象已經(jīng)占有的資源;
2)與構(gòu)造函數(shù)類似,在其中分配新的資源。
類的賦值運(yùn)算符重載“=”只能重載為成員函數(shù),不能重載為友元函數(shù)。
重載后的運(yùn)算符函數(shù)operator=()不能被繼承。
拷貝構(gòu)造函數(shù)和賦值運(yùn)算符重載的區(qū)別:聲明和定義方式不同;調(diào)用方式不同。
5.虛函數(shù)
虛函數(shù)是重載的另一種表現(xiàn)形式,允許虛函數(shù)調(diào)用與函數(shù)體之間的聯(lián)系在運(yùn)行時(shí)才建立。
定義:虛函數(shù)就是在基類中被關(guān)鍵字virtual說(shuō)明,并在派生類中重新定義的函數(shù),在派生類中重新定義時(shí),其函數(shù)原形包括返回類型,函數(shù)名,參數(shù)個(gè)數(shù)與參數(shù)類型的順序,都必須與基類中的原形必須相同。
構(gòu)造函數(shù)不能是虛函數(shù),但析構(gòu)函數(shù)可以是虛函數(shù)。
虛函數(shù)與重載函數(shù)的關(guān)系:當(dāng)普通的函數(shù)重載時(shí),其函數(shù)的參數(shù)或參數(shù)類型必須有所不同,函數(shù)的返回類型也可不同;在派生類中,重新定義虛函數(shù)時(shí)要求函數(shù)名、返回類型、參數(shù)個(gè)數(shù)、參數(shù)的類型和順序與基類中的函數(shù)原形完全相同;若僅僅返回類型不同,其余均相同,系統(tǒng)會(huì)給出錯(cuò)誤信息。虛函數(shù)重載時(shí)若僅僅函數(shù)名相同,而參數(shù)的個(gè)數(shù)、類型或順序不同系統(tǒng)將它作為普遍函數(shù)重載,虛函數(shù)的特征將會(huì)丟失。
多重繼承與虛函數(shù):多重繼承可視為多個(gè)單繼承的組合。
6.純虛函數(shù)和抽象類
純虛函數(shù):是一個(gè)在基類中說(shuō)明的虛函數(shù),他在該基類中沒(méi)有定義,但要求在它的派生類中定義自己的版本,或重新說(shuō)明為純虛函數(shù)。
純虛函數(shù)的一般形式:virtual type func_name(參數(shù)表)=0(type是函數(shù)的返回類型,func_name是函數(shù)名)。
抽象類:一個(gè)類至少有一個(gè)純虛函數(shù)的類。抽象類提供了處理各種不同派生類的統(tǒng)一接口,將實(shí)現(xiàn)的責(zé)任交給了派生類。
另外,站長(zhǎng)團(tuán)上有產(chǎn)品團(tuán)購(gòu),便宜有保證
網(wǎng)頁(yè)名稱:c語(yǔ)言純虛函數(shù) c 純虛函數(shù)
網(wǎng)頁(yè)網(wǎng)址:http://aaarwkj.com/article16/doodsgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、網(wǎng)站設(shè)計(jì)公司、用戶體驗(yàn)、軟件開(kāi)發(fā)、網(wǎng)站改版、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)