簡體   English   中英

不使用虛函數的多態行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM