【发布时间】:2014-08-05 10:02:56
【问题描述】:
众所周知,我们可以使用纯虚析构函数,像这样:
struct A {
virtual ~A() = 0;
};
A::~A() {}
struct B : A {};
因为标准在10.4 [class.abstract] p2中说
纯虚函数只有在使用 (12.4 [class.dtor]) 调用时才需要定义
后来在12.4 [class.dtor] p9
析构函数可以声明为虚拟(10.3)或纯虚拟(10.4);如果在程序中创建了该类或任何派生类的任何对象,则应定义析构函数。
什么意思上面的代码完全有效——A::~A可能是纯虚的,它被定义了,B::~B隐式调用A::~A。
到目前为止,一切都很好。
然后我读到10.4 [class.abstract] p6:
可以从抽象类的构造函数(或析构函数)调用成员函数;对于从这样的构造函数(或析构函数)创建(或销毁)的对象,直接或间接地对纯虚函数进行虚调用(10.3)的效果是未定义的。
但这正是我们在这里所做的——我们从析构函数中调用纯虚函数A::~A。
那么,是不是有些矛盾?
【问题讨论】:
-
析构函数是一种特殊情况,因为即使它是纯虚拟的,它仍然必须有一个主体(根据标准)。未定义部分适用于纯虚成员函数(可能没有定义)。
标签: c++ destructor undefined-behavior pure-virtual