不使用虚函数的多态行为

时间:2011-04-25 15:33:26

标签: c++ c oop

我正在研究微控制器的玩具语言,我有一个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是什么。

2 个答案:

答案 0 :(得分:1)

您的方法存在的问题是基类提供的契约暗示每个可能的函数签名对每个可能的函数都有效。 “函数”的用户不知道哪个签名对于给定的函数实例有效。他们做了吗

   virtual object* call()

   virtual object* call(Object* a)

至少使用函数指针或boost :: function,您可以指定应该预期的签名:

   void object* (*funcPtr)(Object*);

   boost::function< object* (Object*) > boostFunc;

如果你想能够调用任何函数,你可以使用boost :: bind将任何函数转换为上面签名的函数。然后,您可以轻松地将这些功能存储在容器中,并按照您的意愿使用它们。

由于对没有做任何事情的函数的所有调用,你也会浪费你的实现周期。由于涉及运行时多态性,编译器可能无法对此进行优化。

答案 1 :(得分:0)

而不是继承为什么不使用函数指针的查找表(数组)?以下代码是一个快速&amp;脏伪代码,可能不会编译,但应该给你一般的想法。

  enum Functions
  {
     Func1 = 0,
     Func2 = 1  
  };

  void *FunctionPointers[] = { &Function1, &Function2 };


  FunctionPointers[Func1]( some_parameter);