怎么解决在析构函数里调用虚函数的有关问题
如何解决在析构函数里调用虚函数的问题
我现在的程序设计是:
在子类B里new一个worker传给父类A,
父类A会在析构函数里调用worker的清理函数。
但由于worker已经在子类B的析构函数里delete掉了,所以会出问题。
简单表述如下,问一下有什么办法解决。设计的目的是:让父类可以根据接口来调用工作函数、清理函数。
------解决方案--------------------
set pointer这种操作简直就是程序悲剧的开始
------解决方案--------------------
可以根据接口来调用工作函数、清理函数
1. 可以通过虚方法完成
2. 最好是谁new的 谁delete
------解决方案--------------------
这样我感觉好点
------解决方案--------------------
你这是A和B之间对于w的所有权不明的问题,是设计问题,不是什么析构函数怎么调用虚函数的问题。
------解决方案--------------------
Effective C++条款9:绝不在构造和析构函数中调用虚函数。
不过仔细看一下楼主的描述,根本的问题不在这
既然是子类new的worker,为什么非要父类clean呢?
个人感觉这个设计很糟糕,看不出什么好处。
我现在的程序设计是:
在子类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呢?
个人感觉这个设计很糟糕,看不出什么好处。