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

时间:2009-12-08 09:35:50

标签: objective-c class pointers

(目标C)如何使用派生指针调用基类函数,其中foo在派生类中被覆盖。本质上相当于这个C ++代码

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

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

2 个答案:

答案 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));
}