2010-06-26 108 views
0

我有一个函数在我的基类中声明并指定为虚拟的,我试图重新声明它在派生类,但我得到一个多声明错误。函数的多个声明

任何人都知道我是否在这里失去了一些东西?

class Field { 
    public: 
     virtual void display() = 0; 
     virtual int edit() = 0; 
     virtual bool editable() const = 0; 
     virtual void *data() = 0; 
     virtual Field *clone() const = 0; 
}; 

class LField : public Field { 
     int rowNum; 
     int colNum; 
     int width; 
     char *val; 
     bool canEdit; 
     int index; 
    public: 
     virtual void *data() { return val; } 
}; 


class IVField : public LField { 

    void (*ptrFunc)(void *); 
    bool (*ptrValid)(int &); 
    int *data; 

    public: 
     void* data() { 
      return data; 
     } 

}; 

class DVField : public LField { 
    int decimalsToDisplay; 
    double *data; 
    void (*ptrFunc)(void *); 
    bool (*ptrValid)(double&); 
    public: 

     void* data() { 
      return data; 
     } 

}; 
+1

除非您向我们展示您的代码,否则我们无法回答您的问题。 – 2010-06-26 16:28:51

+0

我已添加代码。 – Marcin 2010-06-26 16:36:21

+2

请重新添加代码。没有它,问题和答案都没有意义。 – 2010-06-26 16:43:09

回答

4

您有一个名为data功能,在同一类名为data一个成员变量。这是不允许的。为您的成员变量选择一个不同的名称。

您似乎还重新声明了许多成员变量。这可能不是你想要做的。如果你想在基类中声明它们并在后代中使用它们,那么它们应该可能具有保护的可见性。当你没有指定任何其他类时,类的默认可见性是私有,这意味着例如IVField(例如DVField)的后代不能访问IVField中声明的ptrFunc变量。您在DVField中声明的ptrFun变量与父类中声明的变量完全没有关系。使IVField一个受保护,然后后代不需要为自己复制声明。

在编译器允许您实例化任何这些类之前,您还必须实现所有其他抽象方法。

+0

是的,这是问题所在。谢谢:)定时器完成后会检查标记。 – Marcin 2010-06-26 16:40:37