即使基类和派生类只使用基数据类型,我是否需要定义虚拟析构函数? 根据C++标准:5.3.5/4:
如果[删除运算符的]操作数的静态类型为 与动态类型不同,静态类型应为基类 操作数的动态类型和静态类型的 析构函数或行为未定义 这是否适用于以下情况:即使基类和派生类只使用基数据类型,我是否需要定义虚拟析构函数? 根据C++标准:5.3.5/4:,c++,C++,如果[删除运算符的]操作数的静态类型为 与动态类型不同,静态类型应为基类 操作数的动态类型和静态类型的 析构函数或行为未定义 这是否适用于以下情况: class B { public: virtual void f() const = 0; virtual void g() = 0; }; class D : public B { public: explicit D(int x) : x_ {x} {} void f() const over
class B
{
public:
virtual void f() const = 0;
virtual void g() = 0;
};
class D : public B
{
public:
explicit D(int x) : x_ {x} {}
void f() const override;
void g() override;
private:
int x_;
};
在这种情况下,D和B都没有任何要取消分配的内容,所以是否不再需要提供虚拟析构函数?或者这仍然是未定义的行为吗?标准没有根据类的内容做出任何异常
我会说,“是的,您需要
虚拟的
析构函数。”您引用的标准中的语句意味着一个示例(使用您的类B
和D
)
如果B
没有virtual
析构函数,则具有未定义的行为
这条规则没有例外
类(或它们的成员函数)做什么或不做什么并不重要。正是
B
中的非虚拟析构函数导致delete表达式(delete object
)具有未定义的行为。没有例外。只需按照标准说明,如果动态类型不同,并且您没有虚拟析构函数,那么它就是UB。试图了解这个UB可以或应该是无害的是不相关的。如果您的代码> Debug < /Cord>一个D-通过B*的实例,B需要有一个多态的析构函数。编译器可能会考虑比UB路径是不可达的,因此不会生成那个路径代码。
int main()
{
B *object = new D;
delete object;
}