Objective-C学习笔记是本文要介绍的内容,如前所述,C + +不会让你从Objective-C对象继承C + +类,也不让你从C + +对象继承Objective-C类。
- class Base { };
- @interface ObjCClass: Base ... @end // ERROR!
- class Derived: public ObjCClass ... // ERROR!
不像Objective-C,在C + +的对象是静态类型,运行多态视作是例外情况。因此两种语言的对象模型,无法直接兼容。更根本是,在Objective-C和C + +对象的内存布局是相互矛盾的。
这意味着它是一般不可能创建一个从两种语言的角度都有效的对象实例。因此,这两个类型层次结构不能被混合使用。
你可以在一个声明的Objective-C类中声明一个C + +类。编译器已被视为在全局命名空间中声明这样的类,如下:
- @interface Foo {
- class Bar { ... } // OK
- }
- @end
- Bar *barPtr; // OK
Objective-C允许C结构(不论在Objective-C中声明与否)作为实例变量。
- @interface Foo {
- struct CStruct { ... };
- struct CStruct bigIvar; // OK
- }
- ...
- @end
Objective-C在做类似的努力,使C + +类的实例,作为实例变量。只要c++尽可能的没有
虚拟成员函数的定义,只是问题(随着它的超类的所有)之所在。如果任何虚拟成员函数存在, 在C + +类不得作为Objective-C的实例变量。
- #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 + +中,要求每个包含虚函数的类的实例包含一个合适的虚拟函数表的指针。然而,在Objective-C的运行时不能初始化虚
函数表指针。因为它不像C++对象的模型,同样,在Objective-C的运行时不能要求派遣到C + +构造函数或析构这些对象中。如一个C + +类的任何用户定义的构造或析构函
数,他们不叫。编译器会发出警告,在这种情况下。
Objective-C中没有一个嵌套的命名空间的概念。你不能在C + +命名空间声明Objective - C类,也不能在申Objective -C类声明命名空间。
Objective-C的类、协议和类别不能声明在C + +模板中,也不能在一个Objective-C接口、协议或类别的范围内声明一个c++模板。
然而,Objective-C的类可以作为C + +模板参数。在Objective-C信息表达式中,C + +模板也可以作为接收器或参数使用(但不作为选择器的参数)。
小结:Objective-C学习笔记的内容介绍完了,希望本文对你有所帮助!