怎么解决在析构函数里调用虚函数的有关问题

如何解决在析构函数里调用虚函数的问题
我现在的程序设计是:
  在子类B里new一个worker传给父类A,
  父类A会在析构函数里调用worker的清理函数。
  但由于worker已经在子类B的析构函数里delete掉了,所以会出问题。

简单表述如下,问一下有什么办法解决。设计的目的是:让父类可以根据接口来调用工作函数、清理函数。

#include <iostream>

using namespace std;

class Worker{
  public:
    virtual void clean(){
      cout << "base Worker" << endl;
    }
};

class MyWorker: public Worker {
  virtual void clean() {
    cout << "MyWorker" << endl;
  }
};

class A {
  private:
    Worker* w;
  public:
    void set_w(Worker* pw) {
      w = pw;
    }
  ~A() {
    if (w != NULL) {
      cout << "call w->clean()" << endl;
     w->clean();
    }
  }
};

class B: public A {
  private:
    Worker* w;
  public:
    B() {
      w = new MyWorker();
      set_w(w);
    }

  ~B() {
    delete w;
  }
};

int main() {
  B* b = new B();
  delete b;
}

------解决方案--------------------
set pointer这种操作简直就是程序悲剧的开始
------解决方案--------------------
可以根据接口来调用工作函数、清理函数

1. 可以通过虚方法完成
2. 最好是谁new的 谁delete


------解决方案--------------------
#include <iostream>
 
using namespace std;
 
class Worker{
  public:
    virtual void clean(){
      cout << "base Worker" << endl;
    }
};
 
class MyWorker: public Worker {
  virtual void clean() {
    cout << "MyWorker" << endl;
  }
};
 
class A {
  //private:
  protected:   
  Worker* w;
  public:
    void set_w(Worker* pw) {
      w = pw;
    }
  virutal ~A() {
    if (w != NULL) {
      cout << "call w->clean()" << endl;
     w->clean();
     delete w;
    }
  }
};
 
class B: public A {
  //private:
  //  Worker* w;
  public:
    B() {
      w = new MyWorker();
      set_w(w);
    }
 
  ~B() {
    //delete w;
  }
};
 
int main() {
  B* b = new B();
  delete b;
}

这样我感觉好点
------解决方案--------------------
你这是A和B之间对于w的所有权不明的问题,是设计问题,不是什么析构函数怎么调用虚函数的问题。
------解决方案--------------------
Effective C++条款9:绝不在构造和析构函数中调用虚函数。
不过仔细看一下楼主的描述,根本的问题不在这
既然是子类new的worker,为什么非要父类clean呢?
个人感觉这个设计很糟糕,看不出什么好处。