我对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只发现了关于不在子构造函数中调用虚函数的注释。
任何帮助都将不胜感激。
答案 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;
}
}
};