0

我有一个类,我正在尝试将其作为抽象类来实现,以最大限度地重用代码。但是,两个派生类之间的主要共同点在于每个派生类都有一个消费者和生产者线程。我想知道是否可以让每个静态成员函数调用一个虚拟成员函数来完成所有底层工作。

基本上,是否允许以下​​代码,或者我是否在做一些超级hacky,或者编译器会对我大喊大叫/尖叫?

// in AbstractClass.h
class AbstractClass {
  // some code here including constructors/destructors
 protected:
  virtual int Worker() = 0;  // derived class provides implementation
 private:
  static void* Thread(void* args);
};

// in AbstractClass.cpp
static void* AbstractClass::Thread(void* args) {
  AbstractClass myobject = static_cast<AbstractClass*>(args);
  myobject->Worker();
}

基本上我想知道派生类“worker”是否会被这样调用?请注意,通过传入 Thread() 函数调用 p_thread_create()。

感谢您的帮助,因为我试图提高对继承和虚函数的理解,以及如何使用它来最大化代码重用。

4

1 回答 1

1

是的,代码看起来不错,你的假设是正确的。虚函数的目的是,无论在哪个超类签名上调用该方法,都将调用函数的最派生版本。

使用 pthreads 和 C++,您使用的方法是完全合理的,而不是 hackey。但是,我会在包含静态类方法的单独类中创建线程。这将阻止线程在派生类中混淆。

struct ThreadManager
{
  ThreadManager(AbstractWorker* worker)
  {
     mWorker = worker;
     mThread = ThreadStart(threadFunc, this); /* made up thread code :) */
  }
  ~ThreadManager()
  {
     ThreadStop(mThread);
  }

  static void* threadFunc(void* args)
  {
     ThreadManager* manager = static_cast<ThreadManager*>(args);
     manager->mWorker->Work();
  }

  AbstractWorker* mWorker;
  Thread mThread;
}

请注意,当使用 pthreads 时,实际上需要一个静态函数。

于 2013-07-11T04:59:14.567 回答