通過繼承機制,可以利用已有的數據類型來定義新的數據類型。所定義的新的數據類型不僅擁有新定義的成員,而且還同時擁有舊的成員。我們稱已存在的用來派生新類的類為基類,又稱為父類。由已存在的類派生出的新類稱為派生類,又稱為子類。
在C++語言中,一個派生類可以從一個基類派生,也可以從多個基類派生。從一個基類派生的繼承稱為單繼承;從多個基類派生的繼承稱為多繼承。
例:
#include <iostream.h>
class Metal
{
public:
unsigned atomicNumber;
float atomicWeight;
float pricePerounce;
public:
Metal( unsigned Number=0,
float Weight=0.000000,
float Perounce=0.000000)
{
atomicNumber=Number;
atomicWeight=Weight;
pricePerounce=Perounce;
}
~Metal() {}
unsigned GetNumber(void) {return atomicNumber;} //內聯函數
float GetWeight(void) {return atomicWeight;}
float Getprice(void) {return pricePerounce;}
virtual void output()
{
cout << "The atomic weight =" << atomicWeight << endl;
cout << "The atomic number =" << atomicNumber << endl;
cout << "Price per ounce =" << pricePerounce << endl;
}
};
class Pb : public Metal //公有繼承,單繼承
{
public:
Pb (unsigned Number=82,float Weight=207,float Perounce=0.01):Metal(Number,Weight,Perounce) {}
//子類構造首先調用基類構造函數
};
class Au : public Metal
{
public:
Au (unsigned Number=79,float Weight=196.9665,float Perounce=450.75):Metal(Number,Weight,Perounce) {}
Au (Pb& lemp) //拷貝函數
{
atomicNumber=lemp.GetNumber()-3;
atomicWeight=lemp.GetWeight()-10.2335;
pricePerounce=lemp.Getprice()+450.74;
}
};
void main ()
{
Pb m;
Au n=m; //拷貝
n.output();
}
注:
派生類的三種繼承方式:公有繼承(public)、私有繼承(private)、保護繼承(protected)是常用的三種繼承方式:
公有繼承時,水平訪問和垂直訪問對基類中的公有成員不受限制;
私有繼承時,水平訪問和垂直訪問對基類中的公有成員也不能訪問;
保護繼承時,對于垂直訪問同于公有繼承,對于水平訪問同于私有繼承。
對于基類中的私有成員,只能被基類中的成員函數和友元函數所訪問,不能被其他的函數訪問。
如果通過公有繼承來產生基類,那么這個派生類應該是其基類的特化。
如果派生類之間的區別在于屬性,則用數據成員來表示;如果在于行為,則用虛函數來表示。
任何一個類都可以派生出一個新類,派生類也可以再派生出新類。