从父类调用纯虚函数

时间:2009-10-16 22:47:04

标签: c++ class

我对c ++很新,但我想我明白发生了什么。父类试图在父类中调用纯虚拟成员函数。我认为通过覆盖子类中的虚函数,它会被调用。

我做错了什么?

在parent.h中为我提供

class Parent
{
public:
virtual void run() = 0;
protected:
/** The function to starter routine and it will call run() defined by the
 * appropriate child class.
 * @param arg Arguments for the starter function
 */
static void * init (void * arg);
};

我正在尝试在parent.cpp中执行此操作

void * Parent::init(void * arg)
{
  run();
}

在我的child.h中我有这个:

class Child : public Parent
{public:
//...
virtual void run();
//...
};

在child.cpp中我有:

void Child::run()
{
   sleep(10);
}

parent.cpp中的函数init无法编译。如何从父类调用派生函数?所有我的googleing只发现了关于不在子构造函数中调用虚函数的注释。

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:10)

run()是一个实例成员。 Parent :: init是一个静态(类级别)成员。因此,在init()实现中,没有可用于调用run()的实例(Parent Child)。

答案 1 :(得分:5)

您正尝试从静态方法调用实例方法。您需要将init()更改为实例方法(删除static关键字),否则您需要使用对象调用run()方法,例如obj->run()obj.run()

答案 2 :(得分:2)

您知道arg的实际类型:它实际上是Parent实例吗?如果是,那么......

void Parent::init(void* arg)
{
  Parent* self = static_cast<Parent*>(arg);
  self->run();
}

答案 3 :(得分:0)

请看一下我最近提供的here示例:

/** calls thread_func in a new thread passing it user_data as argument */
thrd_hdl c_api_thread_start(void (*thread_func)(void*), void* user_data);

/** abstract thread base class
* override my_thread::run to do work in another thread
*/
class my_thread {
  public:
    my_thread() hdl_(c_api_thread_start(my_thread::thread_runner,this)) {}
    // ...

  private:
    virtual int run() = 0; // we don't want this to be called from others

    thrd_hdl_t hdl_; // whatever the C threading API uses as a thread handle

    static int thread_runner(void* user_data)
    {
      my_thread* that = reinterpret_cast<my_thread*>(user_data);
      try {
        return that->run();
      } catch(...) {
        return oh_my_an_unknown_error;
      }
    }
};