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>”。但是,在这个上下文中,重写项常常混淆,因为虚拟析构函数实际上不重写而是堆叠在一起,形成了清理链。