[英]Polymorphic behavior without using virtual functions
我正在研究微控制器的玩具語言,我有一個Function類,它有11個虛擬方法,從無參數調用“call”到10個參數,所有參數都采用基礎對象類並返回一個對象類(函數也擴展了對象)。 當我的語言中有函數定義時,我定義了一個擴展Function類的類,並根據其args實現一個虛方法。 每當我想調用一個函數時,我只需將其轉換為Function *並使用其參數調用其調用方法。 所以我有類似下面的東西,
class object {}
//other types that extend object
class Function : public object{
virtual object* call(){}
virtual object* call(Object* a){}
//....
}
//
// then during code generation I define
//
class s243 : public Function{
Object* call(){
//do somthig
}
}
現在擴展函數的每個類的AFAIK將有一個虛函數表,每個實例都有一個指向該表的指針,我正在做的這個微控制器只有2kb的內存,我將至少有50個60函數做基本的東西,所以我正在尋找避免使用虛函數的方法。 基類還定義了一個虛擬函數,它接受自身的深層副本,容器使用它來復制對象而不將其強制轉換為特定類型。
編輯:我有代碼空間很多我可以為ram交易代碼空間。 對於函數指針,函數對象可以保存指向其狀態的指針,
(define make-adder
(lambda (n)
(lambda (x) (+ x n))))
從90分鍾方案編譯器的一個例子,我可以傳遞一個指向n的指針,所以當它返回一個函數時,它知道n是什么。
您的方法的一個問題是基類提供了一個契約,暗示每個可能的函數簽名對每個可能的函數都有效。 “函數”的用戶不知道哪個簽名對於給定的函數實例有效。 他們這樣做
virtual object* call()
要么
virtual object* call(Object* a)
至少使用函數指針或boost ::函數,您可以指定應該預期的簽名:
void object* (*funcPtr)(Object*);
boost::function< object* (Object*) > boostFunc;
如果你想能夠調用任何函數,無論如何,你可以使用boost :: bind將任何函數轉換為上面簽名的函數。 然后,您可以輕松地將這些功能存儲在容器中,並根據您的需要進行操作。
由於對沒有做任何事情的函數的所有調用,你也會浪費你的實現周期。 由於涉及運行時多態性,編譯器可能無法對此進行優化。
而不是繼承為什么不使用函數指針的查找表(數組)? 下面的代碼是一個快速和臟的偽代碼,可能不會編譯,但應該給你一般的想法。
enum Functions
{
Func1 = 0,
Func2 = 1
};
void *FunctionPointers[] = { &Function1, &Function2 };
FunctionPointers[Func1]( some_parameter);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.