2013-08-27 51 views

回答

2

如果你知道规则是安全的,而规则说在析构函数中,对象的动态类型是析构函数正在执行的类。

虽然B::~B()执行时,该对象的类型是B(如果你打电话f()那么,你会得到尽管A::~A()正在执行分派到B::f()

,对象的类型为A,如果调用f()然后,将得到每第10.4节[class.abstract]/6

成员函数可以被称为不确定的行为从抽象类的构造(或析构函数);制作一个虚拟呼叫的效果一个纯虚函数直接TLY或间接为对象被从这样的构造(或析构函数)创建(或破坏)是未定义

或者,作为铛++报告它,

test.cc:5:20: warning: call to pure virtual member function 'f'; overrides of 'f' in subclasses are not available in the destructor of 'A' 
    virtual ~A() { this->f(); } 
       ^
test.cc:7:5: note: 'f' declared here 
    virtual void f() = 0; 
    ^
1 warning generated. 

编辑:OP编辑纯虚那么,当A::~A()正在执行时,虚拟调用f()被调度到A::f()

+0

如果为纯虚拟提供了一个主体,那么它并不是未定义的。 –

+0

我问了一个问题,以确保.. http://stackoverflow.com/questions/18456450/is-it-safe-to-call-a-pure-virtual-function-in-an-abstract-constructor-destructor –

1

注意:OP编辑代码以删除纯虚拟部分。

随着你发布的内容,不,它是不安全的。当您在继承层次结构中的类的构造函数或析构函数中调用虚函数时,它不像往常一样调用大多数派生函数,而是调用当前类中定义的函数。

在这种情况下,〜A调用没有函数体的A :: f(),所以这是一个错误。如果你为A :: f()提供了一个主体(你可以在纯粹的虚拟中做到这一点,只是在类定义之外),那么它就是“安全的”,尽管它是否做到了你想要的是另一回事。