Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使基类和派生类只使用基数据类型,我是否需要定义虚拟析构函数? 根据C++标准:5.3.5/4:_C++ - Fatal编程技术网

即使基类和派生类只使用基数据类型,我是否需要定义虚拟析构函数? 根据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;
}