2009-12-08 90 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],它會忽略它自己的實現並使用超類的方法。

相關問題