修改
我没有更新问题,虽然这样做我意识到问题的范围已经完全改变,所以我为此道歉。我正在处理线程,所以静态函数必须在那里。我试图尽可能地将Threading的东西抽象出来。
我收到pure virtual function call
错误,所以我想也许我的实现错了。这就是我所拥有的:
class Base
{
protected:
virtual int f(void) = 0;
static void baseFunction(void* param);
};
static void Base::baseFunction (void* param)
{
Base *parent = (Base*) parameter;
int i = parent->f();
}
class Derived : public Base
{
private:
int _memeber;
int f(void);
};
int Derived::f(void)
{
_member = 0;
cout << "Derived _memeber is: " << _member << endl;
return 0;
}
void main ()
{
Derived d;
d.baseFunction(d);
}
我需要函数Derived::f(void)
才能访问Derived
类成员。
答案 0 :(得分:2)
定义看起来很好,但我会猜测你是从Base
的构造函数或析构函数调用虚函数。在这种情况下,虚拟分派就像动态类型是Base
而不是Derived
一样,如果函数是纯虚拟的,那么你会得到未定义的行为。
更新:你也说“我正在处理线程”。在这种情况下,数据争用可能会导致一个线程调用该函数,而另一个线程仍在构造该对象 - 再次,给出未定义的行为。您需要确保所有数据访问都已正确同步。
答案 1 :(得分:0)
没关系,只是在类声明后丢失了分号。
答案 2 :(得分:0)
将返回类型添加到Derived方法。还要在类定义
之后添加分号答案 3 :(得分:0)
您缺少f和的返回类型;课后定义
将您的代码更改为
class Base
{
protected:
virtual int f(void) = 0;
};
class Derived : public Base
{
public:
int f(void);
};
int Derived::f(void)
{
// do something here
}
此外,如果可能的话,发布可运行的代码。 Iow add
int main()
{
Derived d;
d.f();
}
到您的代码示例
答案 4 :(得分:0)
将您的两个课程中的所有功能公开化。你为什么要宣布我?它完全没用过。
答案 5 :(得分:-2)
你需要声明
class Derived : public Base
{
protected:
virtual int f(void);
}
我想你的纯虚函数调用来自Base类,在另一个方法中使用f。