类5-类的继承、虚函数、纯虚函数、虚析构函数
一、類的繼承
??? 就像家譜一樣,就是一個繼承圖。爺爺-父親-兒子-孫子等.類也一樣,上面的類稱為基類,也稱父類。基類下面的類叫子類也叫派生類。
??? 子類對父類的一些屬性等有所繼承也有所發(fā)展,因此才有了類的繼承。
???? C++中類的繼承格式為:
???? class ChildClass:public ParentClass;
??? 子類后面要加上冒號及類限制符(public\protected\private)和基類。?
class CExample{
public:
...
protected:
...
private:
...
}
在一個類中,會有三個訪問限制符。
public 是公共,公開的意思,只要有對象訪問CExample類,則它的public部分是可以被此對象訪問的。
???????? 如果是子類來繼承的話,子類可以訪問基本中這部分的信息。
protected 是保護的意思,即只有本類和子類可以訪問這部分內(nèi)容,其它的對象是不可以訪問的。
private 是私有的,即只有本類可以訪問這部分內(nèi)容,其它的對象沒有訪問權(quán)限。
如果我們在繼承基類的時候,如直接這樣寫:
? class CSample:CParent;
此時省略了限制訪問類符號,系統(tǒng)默認是private級的,這時就會把基類中protected和public的成員全變成子類的private區(qū)內(nèi),基類的private 是不能訪問的。
如果為protected,則只能訪問父類中的protected及public,而public成員也在子類中變成protected屬性.
如果為public,則父類中的protected也變成public。
記住以下三點:
?? 如果基類被聲明為private,其成員在派生類中永遠不可訪問。
?? 如果基類被聲明為protected, 其public成員在派生類中將成為protected.
?? 如果其類被聲明為public,其在派生類中的訪問級別保持不變。
二、類的虛函數(shù)
??? 什么叫虛函數(shù)?就是此函數(shù)已在父類中定義,但其在子類中可能要重新再定義。
??? 一般是在函數(shù)頭前加上 virtual關(guān)鍵字。如 virtual type showinfo() const;
三、類的純虛函數(shù)
??? 在基類中我們聲明了一個函數(shù)成員,但沒有給出具體實現(xiàn),因為這個類只是一種很泛的抽象,具體實現(xiàn)函數(shù)的功能要在派生類中實現(xiàn)。它的格式為:
?? virtual type showinfo() const=0;
? 即在虛函數(shù)后面加上=0即可。
? 這樣的類也叫抽象類,抽象類不能實例化。
四、類的虛析構(gòu)函數(shù)
??? 類的虛折構(gòu)函數(shù)在動態(tài)產(chǎn)生對象后并用delete刪除時有用,如果不是動態(tài)產(chǎn)生對象就不用做這樣的聲明。
?? 平常我們是靜態(tài)編譯的,在析構(gòu)時,程序也是靜態(tài)連接的,這時系統(tǒng)知道父類和子類之間的關(guān)系,就會先析構(gòu)子類再析構(gòu)父類。而在動態(tài)產(chǎn)生一個對象時,如下面的例子:
?
Cparent* p=0;p=new CChild(100);
delete p;
在此類中,Cparent類為CChild的父類,我們此時聲明Cparent指針p.因為是動態(tài)在自由存儲區(qū)中分配的,而p又被聲明為Cparent類型的指針,但在賦值時卻指向子類。但在銷毀時,系統(tǒng)認為它是cparent類型的,故會調(diào)用Cparent的析構(gòu)函數(shù),而子類的析構(gòu)函數(shù)不會被執(zhí)行。這就是我們用虛析構(gòu)函數(shù)的原因。
因此:我們在類的繼承時,總是把類的析構(gòu)函數(shù)聲明為虛析構(gòu)函數(shù)是個好主意。
但構(gòu)造函數(shù)是沒有虛的,切記!
以下為代碼:
? Box.h
#pragma onceclass CBox
{
public:
CBox(double lv,double wv, double hv);
CBox();
virtual double volume() const;
double getlength() const;
protected:
virtual void printclassInfo()=0;
double m_length;
double m_width;
double m_height;
};
Box.cpp
#include "Box.h"#include <iostream>
using namespace std;
CBox::CBox(double lv,double wv,double hv):m_length(lv),m_width(wv),m_height(hv)
{
printf("Constructor Called!\n");
}
CBox::CBox()
{
printf("Default construct!\n");
}
double CBox::volume() const
{
return m_height*m_width*m_length;
}
double CBox::getlength() const
{
return m_length;
}
ChildBox.h
#pragma once#include "Box.h"
class CChildBox:public CBox
{
public:
CChildBox(double lv,double wv,double hv);
double volume() const;
virtual void printclassInfo();
};
ChildBox.cpp
#include "ChildBox.h"#include <iostream>
using namespace std;
CChildBox::CChildBox(double lv,double wv,double hv):CBox()
{
m_length=lv;
m_width=wv;
m_height=hv;
printf("CChildBox Construct Called!\n");
}
double CChildBox::volume() const
{
return 3*3*3;
}
void CChildBox::printclassInfo()
{
printf("CChildBox\n");
}
main.cpp
#include "ChildBox.h"#include <iostream>
using namespace std;
void output(CBox& abox)
{
cout<<endl
<<abox.volume()<<endl;
}
void main()
{
CChildBox childbox(12,22,33);
//CBox box(3,0.3,3.5);
CBox* p=0;
p=&childbox;
printf("The volume is: %0.2f \n",p->volume());
printf("the getlength is: %0.2f\n",p->getlength());
output(childbox);
childbox.printclassInfo();
/*p=&box;
printf("The volume is: %0.2f \n",p->volume());
output(box);*/
}
本例中,我們把代碼的頭和定義分開了。
另因為CBox是抽象類,所以不能實例化它,故把main中的部分代碼注釋掉了,如果要把CBox類的中純虛函數(shù)變成虛函數(shù)并實現(xiàn)它,則可以把注釋的部分打開就可以編譯。
轉(zhuǎn)載于:https://www.cnblogs.com/yagzh2000/archive/2011/09/15/2177779.html
總結(jié)
以上是生活随笔為你收集整理的类5-类的继承、虚函数、纯虚函数、虚析构函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows中格式化与快速格式化的区别
- 下一篇: windows无线网卡如何设置