日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

类5-类的继承、虚函数、纯虚函数、虚析构函数

發布時間:2023/12/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 类5-类的继承、虚函数、纯虚函数、虚析构函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、類的繼承

??? 就像家譜一樣,就是一個繼承圖。爺爺-父親-兒子-孫子等.類也一樣,上面的類稱為基類,也稱父類。基類下面的類叫子類也叫派生類。

??? 子類對父類的一些屬性等有所繼承也有所發展,因此才有了類的繼承。

???? C++中類的繼承格式為:

???? class ChildClass:public ParentClass;

??? 子類后面要加上冒號及類限制符(public\protected\private)和基類。?

class CExample
{
public:
...
protected:
...
private:
...
}

在一個類中,會有三個訪問限制符。

public 是公共,公開的意思,只要有對象訪問CExample類,則它的public部分是可以被此對象訪問的。

???????? 如果是子類來繼承的話,子類可以訪問基本中這部分的信息。

protected 是保護的意思,即只有本類和子類可以訪問這部分內容,其它的對象是不可以訪問的。

private 是私有的,即只有本類可以訪問這部分內容,其它的對象沒有訪問權限。

如果我們在繼承基類的時候,如直接這樣寫:

? class CSample:CParent;

此時省略了限制訪問類符號,系統默認是private級的,這時就會把基類中protected和public的成員全變成子類的private區內,基類的private 是不能訪問的。

如果為protected,則只能訪問父類中的protected及public,而public成員也在子類中變成protected屬性.

如果為public,則父類中的protected也變成public。

記住以下三點:

?? 如果基類被聲明為private,其成員在派生類中永遠不可訪問。

?? 如果基類被聲明為protected, 其public成員在派生類中將成為protected.

?? 如果其類被聲明為public,其在派生類中的訪問級別保持不變。

二、類的虛函數

??? 什么叫虛函數?就是此函數已在父類中定義,但其在子類中可能要重新再定義。

??? 一般是在函數頭前加上 virtual關鍵字。如 virtual type showinfo() const;

三、類的純虛函數

??? 在基類中我們聲明了一個函數成員,但沒有給出具體實現,因為這個類只是一種很泛的抽象,具體實現函數的功能要在派生類中實現。它的格式為:

?? virtual type showinfo() const=0;

? 即在虛函數后面加上=0即可。

? 這樣的類也叫抽象類,抽象類不能實例化。

四、類的虛析構函數

??? 類的虛折構函數在動態產生對象后并用delete刪除時有用,如果不是動態產生對象就不用做這樣的聲明。

?? 平常我們是靜態編譯的,在析構時,程序也是靜態連接的,這時系統知道父類和子類之間的關系,就會先析構子類再析構父類。而在動態產生一個對象時,如下面的例子:

?

Cparent* p=0;
p
=new CChild(100);
delete p;

在此類中,Cparent類為CChild的父類,我們此時聲明Cparent指針p.因為是動態在自由存儲區中分配的,而p又被聲明為Cparent類型的指針,但在賦值時卻指向子類。但在銷毀時,系統認為它是cparent類型的,故會調用Cparent的析構函數,而子類的析構函數不會被執行。這就是我們用虛析構函數的原因。

因此:我們在類的繼承時,總是把類的析構函數聲明為虛析構函數是個好主意。

但構造函數是沒有虛的,切記!

以下為代碼:

? Box.h

#pragma once
class 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類的中純虛函數變成虛函數并實現它,則可以把注釋的部分打開就可以編譯。

轉載于:https://www.cnblogs.com/yagzh2000/archive/2011/09/15/2177779.html

總結

以上是生活随笔為你收集整理的类5-类的继承、虚函数、纯虚函数、虚析构函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。