2009-12-08 120 views
2

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

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

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

回答

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)); 
} 
+0

谢谢。我没有考虑过在运行时间来完成这项任务。看起来我有很多要学习的东西。 – 2009-12-08 10:11:58

+2

这是因为你*不应该*看运行时来完成这项任务。使用内部方法调度函数来规避语言应该工作的方式是令人讨厌的。精心设计的代码永远不会需要这样做。 – Chuck 2009-12-08 10:24:50

3

你不知道。 Objective-C的面向对象的观点与C++非常不同。这些不是“类功能” - 它们是对象的方法。更重要的是,您不要直接调用它们 - 您将消息发送给对象,并且对象通过执行适当的方法进行响应。如果一个类选择重写一个方法,那么它的实例将在接收到相应的消息时使用它的实现。直接调用一个方法实现会破坏封装,如果没有一些丑陋的黑客,你就无法做到这一点。

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

相关问题