我实现了一个纯虚函数错了吗?

时间:2012-03-02 13:38:10

标签: c++ oop polymorphism virtual

修改

  

我没有更新问题,虽然这样做我意识到问题的范围已经完全改变,所以我为此道歉。我正在处理线程,所以静态函数必须在那里。我试图尽可能地将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类成员。

6 个答案:

答案 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。