天天看點

5、繼承與派生3-類型相容規則

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()