有人可以覆盖这个callBack()吗?

时间:2013-08-18 17:24:55

标签: class c++11 pthreads method-overriding

通常,必须在Child类中重写callBack()。

但事实并非如此。当线程调用callBack()时,它运行原始方法。

有没有办法解决这个问题?

我用“g ++ -o file source.cpp -lpthread”

编译了它

我确定它与编译器无关。

   #include <iostream>
#include <unistd.h>
#include <pthread.h>

using namespace std;

class Parent
{
    public:
        virtual void callBack()
        {
            cout << "Original callBack() reported this: " << this << endl;
        }
    private:
        pthread_t th = 0;

        static void *th_func(void *arg)
        {
            Parent *p = (Parent*)arg;
            cout << "*th_func() reported *arg: " << arg << endl;
            p->callBack();
        }
    public:
        Parent()
        {
            if(pthread_create(&th, NULL, th_func, (void*)this) < 0)
                cerr << "thread not born." << endl;
            else
                cout << "thread has born." << endl;
        }
        ~Parent()
        {
            if(th!=0)
                pthread_join(th, NULL);
            cout << "joined. Parent leaving." << endl;
        }
};

class Child : public Parent
{
    public:
        void callBack()
        {
            cout << "child overridden." << endl;
        }
        Child() : Parent(){}
};

int main()
{
    Child *ch = new Child();
    delete ch;
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您的代码的问题是您从父构造函数内部调用线程函数。此时,尚未构造Child对象(在C ++中查找对象初始化顺序),因此它可以调用的唯一虚函数是父对象。

从C ++的角度来看,它正在做正确的事情:)。

为了让你的代码工作,你必须将线程创建与对象创建分开,否则你永远无法在派生类中调用函数。

以下是来自C++ FAQ的更多信息。 here是斯科特迈耶斯对此话题所说的话。