C++面向对象程序设计课件1课件.ppt
10.3.2派生類3.私有繼承
當類的繼承方式為private時,基類的公有(public)成員和保護(protected)成員將成為派生類的私有成員,而基類的私有成員不能被派生類訪問。(看下圖:)返回本節目錄如10.1.1中實例2先定義了一個矩形類,然後又從矩形類中派生出正方形類,正方形是矩形的一個特例,矩形類實例化一個矩形對象時需要用到長和寬兩個參數,而正方形則只需要用到邊長一個參數,所以在派生過程中新增了成員函數InitSquare用來完成初始化工作。InitSquare函數實現過程中用到了基類的成員函數InitRect,因為InitRect函數為基類的公有成員,所以在派生類中可以被訪問。如果InitSquare函數的實現過程改為如下語句:
voidInitSquare(floatb)
{length=b;
width=b;}
該程式是不能被編譯通過的,因為派生類是不能訪問基類的私有成員的。另外,該程式使用的繼承方式為公有繼承,因此基類中的公有成員都被派生類吸收並成為公有成員。10.3.2派生類返回本節目錄10.3.3派生類的構造函數與析構函數返回本節目錄繼承的目的是為了發展,派生類繼承了基類的成員,實現了代碼重用,這只是一部分,而代碼的擴充才是最主要的,只有添加新的成員,加入新的功能,類的派生才有實際意義。我們知道,基類的構造函數和析構函數是不能被繼承的,因此如果要對新增成員進行初始化,就必須加入新的構造函數。同樣,對派生類對象的掃尾、清理工作也需要引入新的析構函數。1.派生類的構造函數如果基類的對象包含對成員的初始化,而在建立派生類對象時,由於基類的構造函數不能被繼承而無法執行,因此會使基類的成員未初始化,所以在設計派生類的構造函數10.3.3派生類的構造函數與析構函數返回本節目錄時,不僅要考慮派生類新增的數據成員的初始化,還應當考慮基類數據成員的初始化。
派生類構造函數的一般格式為:
派生類構造函數名(參數列表):基類構造函數名(參數列表)
{
派生類新增成員初始化語句;
}
將【例10.2】改為使用構造函數進行初始化:【例10.11】程式名為l10_11.cpp。
#includeiostream.h
classrectangle//定義矩形類(基類)
{public:
rectangle(floatlen,floatwid)//基類的構造函數 {length=len;
width=wid;
}floatGetArea();
floatGetPerimeter();
private://定義私有成員變數
floatlength;
floatwidth;
};
floatrectangle::GetArea()//基類成員函數實現
{returnlength*width;
}
floatrectangle::GetPerimeter()//基類成員函數實現
{return2*(length+width);
}
classrect:publicrectangle//從矩形類中派生新類(正方形類)
{public:
rect(floatb):rectangle(b,b)//派生類的構造函數
{}
};10.3.3派生類的構造函數與析構函數返回本節目錄10.3.3派生類的構造函數與析構函數返回本節目錄voidmain()
{rectx(8);//聲明正方形類對象
coutx.GetArea()endl;//調用從矩形類中繼承
//下來的成員函數(GetArea)
coutx.GetPerimeter()endl;//調用從矩形類中繼承下來