我有一个看起来像这样的设置
class A
{
virtual void doSomething() = 0;
extern "C" A* getSingleton();
class B {
B() { getSingleton()->doSomething(); }
~B() { getSingleton()->doSomething(); }
};
};
class C : public A
{
static A a;
extern "C" A* getSingleton() { return &C::a; }
void doSomething() { //things }
// also has a container of Bs that will be added to and removed from regularly
}
与' __ cxa_pure_virtual'在析构函数中,但不是构造函数。 C :: a在为简洁省略的不同文件中正确定义
我已经读过从ctors / dtors调用虚函数通常是一个坏主意,但是在这种情况下它会使B的使用更好,所以我有兴趣让它安全地工作。任何人都可以解释为什么B的ctor设法做这个狡猾的行动,但dtor不能,然后我怎么能正确地重做呢?
答案 0 :(得分:0)
问题在于执行顺序。
在C ++中,对象是从上到下创建的。 这是什么意思?
当你有一个X和Y班。 Y类继承自X。
X ="父亲" Y ="儿子"
当您实例化Y类型的对象,并在构造函数和析构函数上放置一些打印时,您将看到首先调用X的构造函数,然后调用类Y的构造函数。
破坏(当然)是倒置的。 首先称为Y的析构函数,然后是类X的析构函数。
知道了,然后我们看看你有的OO问题: 在X类(父)的析构函数中调用虚拟纯方法。 当执行X类的析构函数时,Y(子)对象不再存在。
那么:X对象如何找到虚拟纯方法,应该在继承的类/对象中实现?