从内部类

时间:2017-08-30 11:07:30

标签: c++ destructor virtual-functions pure-virtual

我有一个看起来像这样的设置

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不能,然后我怎么能正确地重做呢?

1 个答案:

答案 0 :(得分:0)

问题在于执行顺序。

在C ++中,对象是从上到下创建的。 这是什么意思?

当你有一个X和Y班。 Y类继承自X。

X ="父亲" Y ="儿子"

当您实例化Y类型的对象,并在构造函数和析构函数上放置一些打印时,您将看到首先调用X的构造函数,然后调用类Y的构造函数。

破坏(当然)是倒置的。 首先称为Y的析构函数,然后是类X的析构函数。

知道了,然后我们看看你有的OO问题: 在X类(父)的析构函数中调用虚拟纯方法。 当执行X类的析构函数时,Y(子)对象不再存在。

那么:X对象如何找到虚拟纯方法,应该在继承的类/对象中实现?