黑馬程式員學習筆記_OC之多态
1、 多态實質:父類指針指向子類對象,沒有繼承就沒有多态
2、 執行個體:例如設計一個animal類,包括方法eat,輸出“animal eat---”。再設計一個dog類繼承animal,重寫eat方法,輸出“dog eat-----”。可以采用如下代碼實作對dog對象的調用。
Animal *a = [Dognew];
[a eat] ;
這樣的話,輸出的即為dog eat-----,說明調用的是dog的方法。原因是執行時會動态檢測指針的真實類型。
3、 好處:在2的基礎上再設計一個類cat繼承animal,重寫eat方法,輸出“cat eat----”,再設計一個函數feed函數如下:
void feed (dog*d)
{
[d eat];
}
這個函數可以執行dog吃的動作,但是不能執行cat吃東西的動作,如果想在主函數中調用讓cat吃東西的話,還要設計一個函數如下:
void feed2 (cat*c)
{
[c eat];
}
這樣在主函數中寫入如下代碼:
Dog *dd = [Dognew];
Cat *cc = [Catnew];
feed(dd);
feed(cc);
這樣才能成功調用貓和狗的吃。
使用多态可以節省上述編法代碼,執行個體如下:

4、多态局限性:如果上述例子的狗類中多加一個對象方法run,執行如下代碼:
Animal *a = [Dognew];
[a run];
執行上述代碼時發現有警告但能運作,我們規定不能這樣寫。這是多态的局限性:父類類型的指針不能用來調用子類的特有方法。如果實在想調用可以用強制轉換的方法實作,代碼如下:
Animal *a = [Dognew];
Dog *d = [Dog *]a;
[d run];
即必須轉化為子類類型指針變量。