1、類型相容規則是指在需要基類對象的任何地方,都可以使用公有派生類的對象來替代。通過公有繼承,派生類得到了基類中除構造函數、析構函數之外的所有成員。這樣公有派生類實際就具備了基類的所有功能,凡是基類能解決的問題,公有派生類都可以解決。類型相容規則中所指的替代包括以下的情況:
a、派生類的對象可以指派給基類對象
b、派生類的對象可以初始化基類的引用。
c、派生類對象的位址可以賦給指向基類的指針。
在替代之後,派生類對象可以作為基類的對象使用,但隻能使用從基類繼承的成員。
eg:
class B
{...}
class D:public B
{...}
B b1,*pb1;
D d1;
這時,
a、派生類對象可以指派給基類對象,即派生類對象中從基類繼承來的成員,逐個指派給基類對象的成員:
b1=d1;
b、派生類的對象也可以初始化基類對象的引用
B &bb=d1;
c、派生類對象的位址也可以指派給指向基類的指針
pb1=&d1;
由于類型相容規則的引入,對于基類及公有派生類的對象,我們可以使用相同的函數統一進行處理(因為當函數的形參為基類的對象時,實參可以是派生類的對象),而沒有必要為每一個類設計單獨的子產品,大大提高了程式的效率。這正是c++的又一重要特性,即多态性,可以說,類型相容規則是多态性的重要基礎之一。
eg:類型相容規則執行個體
基類B0以公有方式派生出B1類,B1類再作為基類以公有方式派生出D1類,基類B0中定義了成員函數display(),在派生類中對這個成員函數進行了覆寫。
#include<iostream>
using namespace std;
class B0
{
public:
void display(){cout<<"B0::display()"<<endl;}//共有成員函數
};
class B1:public B0 //公有派生類B1定義
{
public:
void display(){cout<<"B1::display()"<<endl;}
};
class D1:public B1 //公有派生類D1定義
{
public:
void display(){cout<<"D1::display()"<<endl;}//公有成員函數
};
void fun(B0 *ptr) //普普通函數,參數為指向基類對象的指針
{
ptr->display();//對象指針->成員名
}
int main()
{
B0 b0;//聲明B0類對象
B1 b1;//聲明B1類對象
D1 d1;//聲明d1類對象
B0 *p;//聲明B0類指針
p=&b0;//B0類指針指向B0類對象
fun(p);
p=&b1;//B0類指針指向B1類對象
fun(p);
p=&d1;//B0類指針指向D1類對象
fun(p);
}
輸出結果:
B0::display()
B0::display()
B0::display()