1

通常, callBack() 必须在 Child 类中被覆盖。

但事实并非如此。当线程调用 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;
}
4

1 回答 1

1

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

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

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

以下是来自C++ FAQ的更多信息。以下是 Scott Meyers 对这个话题的看法。

于 2013-08-18T17:32:04.267 回答