(目标C)如何使用派生指针调用基类函数,其中foo在派生类中被覆盖。本质上相当于这个C ++代码
base* b_ptr = 0 ;
derived* d_ptr = new derived() ;
d->base::foo() ;
我认为这应该相当简单。我需要使用选择器吗?
答案 0 :(得分:3)
你没有。 Objective-C的面向对象视图与C ++有很大的不同。这些不是“类函数” - 它们是对象的方法。更重要的是,您不直接调用它们 - 您向对象发送消息,并且对象通过执行适当的方法进行响应。如果一个类选择覆盖一个方法,那么这是它的实例在收到相应的消息时将使用的实现。直接调用方法实现会破坏封装,如果没有一些丑陋的黑客,你就无法做到。
有一个有限的例外:在方法实现中,有两个名称用于引用当前对象。如果您说[self doSomething]
,那么它将调用当前类的doSomething
方法。如果你编写[super doSomething]
,它将忽略它自己的实现并使用超类的方法。
答案 1 :(得分:2)
通常只能使用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));
}