4 回答

TA貢獻(xiàn)1851條經(jīng)驗 獲得超5個贊
繼承是指,子類可以自動獲得父類提供的函數(shù),如父類提供了foo函數(shù),則子類也會有foo函數(shù)
多態(tài)是指,子類可以重寫父類的某個函數(shù),從而為這個函數(shù)提供不同于父類的行為。一個父類的多個子類可以為同一個函數(shù)提供不同的實現(xiàn),從而在父類這個公共的接口下,表現(xiàn)出多種行為
當(dāng)然,以上的自動獲得和重寫,還存在一個訪問級別的概念。比如public的函數(shù)或者protected的函數(shù)才能被重寫這類的限制。

TA貢獻(xiàn)1831條經(jīng)驗 獲得超10個贊
C++的繼承和多態(tài)的區(qū)別
繼承:是指子類按照一定方式繼承基類的成員及函數(shù)。
如果此時定義一個基類的指針,并把子類的對象傳給這個基類指針.假如子類和基類都有一個相同函數(shù)。那么這個指針調(diào)用這個函數(shù)則到底調(diào)用的是基類的函數(shù)還是子類的函數(shù)呢?答案是:基類的函數(shù)。因為函數(shù)的調(diào)用取決于基類的指針類型,而不是取決于指針指向的對象類型。
如下:
Class shape
{
shape();
~shape();
display(); //畫一個多邊形
}
Class CRect:public shape
{
CRect();
~CRect();
display(); //畫一個矩形
}
shape* pshape;
CRect rct;
pshape=&rct; //指向子類對象,最好不要用一個子類指針指向一個基類對象,因為這樣危險性大.
pshape->display(); //它調(diào)用的仍然是基類的shape的display函數(shù)即畫一個多邊形以上的這種特性就是函數(shù)的一般性,即指針調(diào)用的函數(shù)取決于指針類型,而不取決于指向的對象類型。假如這個基類派生了很多子類,且每個子類都定義了個函數(shù)對基類的函數(shù)進(jìn)行覆蓋,此時多個基類指針指向不同子類對象,調(diào)用子類的覆蓋函數(shù),則這些指針的行為都是一樣的,即都是調(diào)用基類的函數(shù)而不是子類相對應(yīng)的函數(shù)。
從上可以看出,這種特性并不具有多態(tài)性,因為它不會自動隨著指向的對象而調(diào)用對象的函數(shù)。那么如何能實現(xiàn)這種特性呢?這時就需要一種技術(shù),即虛函數(shù)。虛函數(shù)是實現(xiàn)多態(tài)性的方法。
虛函數(shù)就是在函數(shù)的前面加上一個Virtual即可。
虛函數(shù)中有一種比較特別:純虛函數(shù)。
它的目的:純虛函數(shù)不能定義函數(shù)的實際動作,它的存在只是為了在衍生類別中對它能夠進(jìn)行重新定義,實現(xiàn)實態(tài)特性.
它的定義方式: virtual 函數(shù)類型 函數(shù)名(參數(shù))= 0; //一定要“= 0”
它的約束:如果一個類中有純虛函數(shù),則這個類叫做抽象類,它是不能定義對象的。

TA貢獻(xiàn)1850條經(jīng)驗 獲得超11個贊
一,兩者的定義不同:
1,C++多重繼承:一個派生類指定多個基類,這樣的繼承結(jié)構(gòu)被稱做多重繼承;
2,多態(tài)性可以簡單地概括為“一個接口,多種方法”,程序在運(yùn)行時才決定調(diào)用的函數(shù),多態(tài)(polymorphism),字面意思多種形狀,多態(tài)的目的則是為了接口重用。
二,兩者的繼承形式不同:
1,多重繼承的一般形式為:
class類名l:訪問控制類名2,訪問控制類名3,…訪問控制類名n
(
…//定義派生類自己的成員
};
2,C++中,多態(tài)性分為兩種,一種稱為編譯時多態(tài),另一種為運(yùn)行時多態(tài):
?。?)編譯時多態(tài),也就是函數(shù)重載,所謂函數(shù)重載是指同一個函數(shù)名可以對應(yīng)著多個函數(shù)的實現(xiàn),具體調(diào)用哪個按照由參數(shù)個數(shù),參數(shù)類型等來決定;
?。?)運(yùn)行時多態(tài),就是虛函數(shù):在定義了虛函數(shù)后,可以在基類的派生類中對虛函數(shù)重新定義,以實現(xiàn)你所想要的功能;比如:
class A {
public:virtual void test() {...}
void display(){...}
};
class B :public A {
public:virtual void test() {...}
void display(A& a){ a.display(); }
};
那么:
A* a = new A();
a->test();調(diào)用的是基類的
A* b = new B();
b->test();調(diào)用的是派生類的.
如果在A中不申明virtual,
那么:
A* b = new B();
b->test(); 會調(diào)用基類的。
- 4 回答
- 0 關(guān)注
- 683 瀏覽
添加回答
舉報