Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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++ 析构函数上的虚拟传播_C++_Polymorphism_Destructor - Fatal编程技术网

C++ 析构函数上的虚拟传播

C++ 析构函数上的虚拟传播,c++,polymorphism,destructor,C++,Polymorphism,Destructor,我知道virtual会传播到派生类方法,可以选择在派生类的方法声明中添加关键字,并且我知道我必须将基类的析构函数标记为virtual,以便进行多态销毁,但我想知道的是,派生类的默认析构函数是否继承基类的虚拟析构函数的virtual,因此我必须在派生类上显式地编写它 例如: class A{ public: virtual ~A() override = default; } class B: public A{ public: // have i to write this or

我知道
virtual
会传播到派生类方法,可以选择在派生类的方法声明中添加关键字,并且我知道我必须将基类的析构函数标记为
virtual
,以便进行多态销毁,但我想知道的是,派生类的默认析构函数是否继承基类的虚拟析构函数的
virtual
,因此我必须在派生类上显式地编写它

例如:

class A{
public:
    virtual ~A() override = default;
}
class B: public A{
public:
    // have i to write this or it's already what the compiler get as default?
    virtual ~B() override = default;
}

是一旦一个成员函数(包括析构函数)被标记为在基类中,它在所有派生类中保持为
virtual


您可以在
~B()
声明中省略关键字
virtual
,甚至可以完全省略
~B()
,如果它是空的。

是一旦成员函数(包括析构函数)被标记为基类中的,它在所有派生类中仍然是
virtual


您可以在
~B()
声明中忽略关键字
virtual
,甚至可以完全忽略
~B()
,如果它是空的。

派生类的析构函数,尽管它与基类的析构函数有不同的名称,会覆盖基类析构函数。与任何其他重写一样,如果它重写的是虚拟的,则它是虚拟的。

派生类的析构函数,尽管与基类的析构函数有不同的名称,重写基类析构函数。就像任何其他重写一样,如果它重写的是虚拟的,那么它就是虚拟的。

哦,是的,对不起@rustyx您的示例代码会触发编译器错误,因为
~a()
不会重写任何内容。(从该声明中删除
override
关键字?也可以从
~B()
中删除,因为在同一声明中同时使用
virtual
override
是过分的,您需要
virtual
来说明您的问题。)哦,是的,很抱歉@rustyx您的示例代码触发了编译器错误,因为
~a()
不会覆盖任何内容。(从该声明中删除
override
关键字?也可以从
~B()
中删除,因为在同一声明中同时使用
virtual
override
是过分的,您需要
virtual
来说明您的问题。)是的,我的问题是因为我在运行时读取了C++,试图找到完整的方法结构“匹配”,所以相同的名称、参数、const ECC ECC(除了接受的指针也派生),因此析构函数不是其中之一,因为它们具有不同的名称空间析构函数没有名称;正是C++语法需要<代码> ~。然而,在这个上下文中,重写项常常会混淆,因为虚拟析构函数实际上不会重写,而是堆叠在一起,形成一个清理链。是的,我的问题是因为我在运行时读取了C++,试图找到完整的方法结构“匹配”,所以相同的名称、参数、const ECC ECC。(接受也派生的指针除外)因此析构函数不是其中之一,因为它们有不同的NAMESA析构函数没有名字;它只是C++语法需要“代码> ~//COD>”。但是,在这个上下文中,重写项常常混淆,因为虚拟析构函数实际上不重写而是堆叠在一起,形成了清理链。