Objective-C學(xué)習(xí)筆記相關(guān)教程
Objective-C學(xué)習(xí)筆記是本文要介紹的內(nèi)容,如前所述,C + +不會讓你從Objective-C對象繼承C + +類,也不讓你從C + +對象繼承Objective-C類。
- class Base { };
- @interface ObjCClass: Base ... @end // ERROR!
- class Derived: public ObjCClass ... // ERROR!
不像Objective-C,在C + +的對象是靜態(tài)類型,運(yùn)行多態(tài)視作是例外情況。因此兩種語言的對象模型,無法直接兼容。更根本是,在Objective-C和C + +對象的內(nèi)存布局是相互矛盾的。
這意味著它是一般不可能創(chuàng)建一個(gè)從兩種語言的角度都有效的對象實(shí)例。因此,這兩個(gè)類型層次結(jié)構(gòu)不能被混合使用。
你可以在一個(gè)聲明的Objective-C類中聲明一個(gè)C + +類。編譯器已被視為在全局命名空間中聲明這樣的類,如下:
- @interface Foo {
- class Bar { ... } // OK
- }
- @end
- Bar *barPtr; // OK
Objective-C允許C結(jié)構(gòu)(不論在Objective-C中聲明與否)作為實(shí)例變量。
- @interface Foo {
- struct CStruct { ... };
- struct CStruct bigIvar; // OK
- }
- ...
- @end
Objective-C在做類似的努力,使C + +類的實(shí)例,作為實(shí)例變量。只要c++盡可能的沒有
虛擬成員函數(shù)的定義,只是問題(隨著它的超類的所有)之所在。如果任何虛擬成員函數(shù)存在, 在C + +類不得作為Objective-C的實(shí)例變量。
- #import <Cocoa/Cocoa.h>
- struct Class0 { void foo(); };
- struct Class1 { virtual void foo(); };
- struct Class2 { Class2(int i, int j); };
- @interface Foo : NSObject {
- Class0 class0; // OK
- Class1 class1; // ERROR!
- Class1 *ptr; // OK—call 'ptr = new Class1()' from Foo's init,
- // 'delete ptr' from Foo's dealloc
- Class2 class2; // WARNING - constructor not called!
- }
- …
- @end
C + +中,要求每個(gè)包含虛函數(shù)的類的實(shí)例包含一個(gè)合適的虛擬函數(shù)表的指針。然而,在Objective-C的運(yùn)行時(shí)不能初始化虛
函數(shù)表指針。因?yàn)樗幌馛++對象的模型,同樣,在Objective-C的運(yùn)行時(shí)不能要求派遣到C + +構(gòu)造函數(shù)或析構(gòu)這些對象中。如一個(gè)C + +類的任何用戶定義的構(gòu)造或析構(gòu)函
數(shù),他們不叫。編譯器會發(fā)出警告,在這種情況下。
Objective-C中沒有一個(gè)嵌套的命名空間的概念。你不能在C + +命名空間聲明Objective - C類,也不能在申Objective -C類聲明命名空間。
Objective-C的類、協(xié)議和類別不能聲明在C + +模板中,也不能在一個(gè)Objective-C接口、協(xié)議或類別的范圍內(nèi)聲明一個(gè)c++模板。
然而,Objective-C的類可以作為C + +模板參數(shù)。在Objective-C信息表達(dá)式中,C + +模板也可以作為接收器或參數(shù)使用(但不作為選擇器的參數(shù))。
小結(jié):Objective-C學(xué)習(xí)筆記的內(nèi)容介紹完了,希望本文對你有所幫助!