注意:本文中代碼均使用 Qt 開發(fā)編譯環(huán)境
C++ 類型兼容規(guī)則###
類型兼容規(guī)則是指在需要基類對象的任何地方芬骄,都可以使用公有派生類的對象來代替粉捻。
通過公有繼承阳藻,派生類得到了基類中除構(gòu)造函數(shù)和析構(gòu)函數(shù)之外的所有成員打月。這樣外臂,公有派生類實際上就具備了基類的所有功能,凡是基類能解決的問題犀斋,公有派生類都可以解決贝乎。
類型兼容中所指的替代包括以下幾種情況:
1.派生類的對象可以賦值給基類對象。
2.派生類的對象可以初始化基類的引用叽粹。
3.派生類對象的地址可以賦值給指向基類的指針糕非。
在替代之后,派生類對象就可以作為基類的對象使用球榆,但是只能使用從基類繼承的成員朽肥。
示例:
class B{...};
class D:public B{...};
B b1,*pb1;
D d1;
這時:
(1)派生類的對象可以賦值給基類對象。 b1 = d1;
(2)派生類的對象可以初始化基類的引用持钉。 B &bb = d1;
(3)派生類對象的地址可以賦值給指向基類的指針衡招。 pb1 = &d1;
由于類型兼容規(guī)則的引入,對于基類及其公有派生類的對象每强,我們可以使用相同的函數(shù)統(tǒng)一處理(因為當(dāng)函數(shù)的形參為基類的對象時始腾,實參可以是派生類的對象)州刽,而沒有必要為每一個類設(shè)計單獨的模塊,大大提高了程序的效率浪箭。
示例:
#include <QCoreApplication>
#include <QDebug>
class B0 {//基類B0聲明
public:
void display(){qDebug()<<"B0::display()";} //公有成員函數(shù)
};
class B1: public B0 {
public:
void display(){qDebug()<<"B1::display()";}
};
class D1: public B1 {
public:
void display(){qDebug()<<"D1::display()";}
};
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);
return 0;
}
運行結(jié)果:
運行結(jié)果
根據(jù)類型兼容規(guī)則穗椅,我們可以在基類對象出現(xiàn)的場合使用派生類對象進行替代,但是替代之后派生類僅僅發(fā)揮出基類的作用奶栖。