C++ 除了删除派生类中动态分配的内存外,使用纯虚拟析构函数还有其他原因吗? 阶级基础 { 公众: 虚基=0; }; Base::~Base{}; 派生类:公共基 { 公众: ~派生重写 { 有时您希望类是抽象的。使类抽象的唯一方法是将一个成员函数声明为纯虚拟的。如果您的类没有其他成员函数,那么至少它有一个析构函数。在这种情况下,唯一可以使其纯的成员函数是析构函数

C++ 除了删除派生类中动态分配的内存外,使用纯虚拟析构函数还有其他原因吗? 阶级基础 { 公众: 虚基=0; }; Base::~Base{}; 派生类:公共基 { 公众: ~派生重写 { 有时您希望类是抽象的。使类抽象的唯一方法是将一个成员函数声明为纯虚拟的。如果您的类没有其他成员函数,那么至少它有一个析构函数。在这种情况下,唯一可以使其纯的成员函数是析构函数,c++,polymorphism,virtual,C++,Polymorphism,Virtual,据我所知,没有其他理由将虚拟析构函数声明为纯析构函数。有时您希望类是抽象的。使类抽象的唯一方法是将成员函数声明为纯虚拟的。如果您的类没有其他成员函数,那么至少它有一个析构函数。在这种情况下,只有可以使其成为纯虚拟的成员函数ure是析构函数 据我所知,没有其他理由将虚拟析构函数声明为纯。如果您希望类是抽象的,因此是多态类型,并在使用基类指针删除派生类的实例时自行行为,则可以选择将析构函数声明为纯虚拟的 但必须为析构函数提供一个函数体,否则程序链接将失败,析构函数不能被重写 class Base {

据我所知,没有其他理由将虚拟析构函数声明为纯析构函数。

有时您希望类是抽象的。使类抽象的唯一方法是将成员函数声明为纯虚拟的。如果您的类没有其他成员函数,那么至少它有一个析构函数。在这种情况下,只有可以使其成为纯虚拟的成员函数ure是析构函数


据我所知,没有其他理由将虚拟析构函数声明为纯。

如果您希望类是抽象的,因此是多态类型,并在使用基类指针删除派生类的实例时自行行为,则可以选择将析构函数声明为纯虚拟的

但必须为析构函数提供一个函数体,否则程序链接将失败,析构函数不能被重写

class Base
{
public:
    virtual ~Base() = 0;
};
Base::~Base() = default;

该语言不提供使析构函数纯虚拟并在一条语句中指定编译器默认值的方法。

如果您希望类是抽象的,因此是多态类型,并在使用基类指针删除派生类的实例时表现出自身的行为,则可以选择使析构函数纯虚拟。

但必须为析构函数提供一个函数体,否则程序链接将失败,析构函数不能被重写

class Base
{
public:
    virtual ~Base() = 0;
};
Base::~Base() = default;

该语言不提供使析构函数为纯虚拟并在一条语句中指定编译器默认值的方法。

有一种更简单的方法来看待这一点。试试看:我想确保我完全理解这意味着什么以及这是如何工作的,所以当我需要一个带有虚拟析构函数的类时,无论出于何种原因,我都会选择k现在具体做什么。删除拥有的内存是实现析构函数的一个有效理由。这与它是否为纯虚拟无关。拥有纯虚拟析构函数独立于实现非默认析构函数。好吧,您可以在以下情况下使用纯虚拟析构函数:1您需要一个不可实例化的基,2您不需要拥有/想要任何其他纯虚拟成员函数,并且3您需要您的类是多态的。请注意,此类类不仅影响通过基类指针进行的删除。它们还影响(例如)dynamic_cast等的使用。在形式上,如果您新建派生类型的对象,并通过指向基类的指针将其删除,则基类必须是虚拟的。@PeteBecker virtual是的,但不一定是纯虚拟的,这是目前的问题。两个不同的概念。纯虚拟唯一能做的就是强制派生类型使用新的实现重写虚拟,仅此而已。这并不是获得一般多态行为所必需的。有一个这是一种更简单的方法。试试看:我想确保我完全理解这意味着什么以及它是如何工作的,所以当我需要一个带有虚拟析构函数的类时,无论出于什么原因,我都会确切地知道该做什么。删除拥有的内存是实现析构函数的一个有效原因。这与是否存在析构函数无关ng纯虚拟。拥有纯虚拟析构函数独立于实现非默认析构函数。AFAIK,您可以在以下情况下使用纯虚拟析构函数:1您需要一个不可实例化的基类,2您不需要/不需要任何其他纯虚拟成员函数,3您需要类具有多态性。请注意,此类类不会影响仅通过基类指针删除。它们影响,例如,还影响dynamic_cast等的使用。从形式上讲,如果新建派生类型的对象并通过指向基类的指针删除它,基类中的析构函数必须是虚拟的。@PeteBecker virtual是的,但不一定是纯虚拟的,这是当前的问题。两个不同的概念。纯虚拟唯一能做的就是强制派生类型使用新的实现重写虚拟,仅此而已。这并不是获得多态行为所必需的。virtual~Base=default;在我看来是一个更好的选择。@IlCapitano:但它不是纯虚拟的,因此该类不是抽象的,除非您编写另一个pu当然是重虚函数。而Base::~Base{};也有它自己的问题。virtual~Base=default;在我看来是一个更好的选择。@IlCapitano:但是它不是纯虚函数,所以类不是抽象的,除非你编写另一个纯虚函数。当然,Bas e::~Base{};有自己的问题。