Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 通过派生指针调用基类函数_Objective C_Class_Pointers - Fatal编程技术网

Objective c 通过派生指针调用基类函数

Objective c 通过派生指针调用基类函数,objective-c,class,pointers,Objective C,Class,Pointers,(目标C)在派生类中重写foo的情况下,如何使用派生指针调用基类函数。本质上相当于这个C++代码 base* b_ptr = 0 ; derived* d_ptr = new derived() ; d->base::foo() ; 我认为这应该相当简单。我需要使用选择器吗?您不需要。Objective-C的面向对象视图与C++的非常不同。这些不是“类函数”——它们是对象的方法。更重要的是,您不直接调用它们——您向对象发送消息,对象通过执行适当的方法进行响应。如果一个类选择重写一个方法,

(目标C)在派生类中重写foo的情况下,如何使用派生指针调用基类函数。本质上相当于这个C++代码

base* b_ptr = 0 ;
derived* d_ptr = new derived() ;
d->base::foo() ;

我认为这应该相当简单。我需要使用选择器吗?

您不需要。Objective-C的面向对象视图与C++的非常不同。这些不是“类函数”——它们是对象的方法。更重要的是,您不直接调用它们——您向对象发送消息,对象通过执行适当的方法进行响应。如果一个类选择重写一个方法,那么当它接收到相应的消息时,它的实例将使用这个实现。直接调用方法实现会破坏封装,如果没有一些难看的技巧,就无法做到这一点


有一个有限的例外:在方法实现中,有两个名称用于引用当前对象。如果您说
[self doSomething]
,那么它将调用当前类的
doSomething
方法。如果您改为编写
[super doSomething]
,它将忽略自己的实现并使用超类的方法。

您通常只会在类内部使用super关键字执行此操作

- (int)doSomething {
    NSLog(@"calling doSomething on base class");
    return [super doSomething];
}
但是,仍然可以使用运行时函数objc_msgSendSuper从类外执行此操作,但这有点棘手

#import <objc/objc-runtime.h>

...

Derived *d = [Derived new];

// call doSomething on derived class
[d doSomething];

// call doSomething on base class
struct objc_super b = {
    .receiver = d,
    .class = class_getSuperclass([d class])
};
objc_msgSendSuper(&b, @selector(doSomething));
}
#导入
...
派生*d=[派生新];
//对派生类调用doSomething
[d剂量测定];
//在基类上调用doSomething
结构对象超级b={
.receiver=d,
.class=class\u getSuperclass([d class])
};
objc_msgSendSuper(&b,@selector(doSomething));
}

谢谢。我没有想到要通过查看运行时来完成这项任务。看起来我还有很多东西要学。那是因为你不应该在运行时完成这项任务。使用内部方法分派函数来规避语言的工作方式是令人讨厌的。设计良好的代码永远不需要这样做。