C++ 抽象类对象和纯虚析构函数

C++ 抽象类对象和纯虚析构函数,c++,C++,我们不能创建抽象类的对象,那么为什么抽象类需要析构函数呢?对于抽象类,是否有必要将析构函数设为纯虚拟类 class Base() { public: virtual ~Base() = 0; }; Base :: ~Base() { } class Derived :: public Base { public: ~Derived(); }; 我们不能创建抽象类的对象 这意味着抽象类本身无法实例化。但这并不意味着抽象类的对象不能被实例化为派生对

我们不能创建抽象类的对象,那么为什么抽象类需要析构函数呢?对于抽象类,是否有必要将析构函数设为纯虚拟类

class Base()  
{  
public:  
    virtual ~Base() = 0;  
}; 
Base :: ~Base()
{
}
class Derived :: public Base  
{  
public:  
    ~Derived();  
};
我们不能创建抽象类的对象

这意味着抽象类本身无法实例化。但这并不意味着抽象类的对象不能被实例化为派生对象的一部分:任何派生类的实例也是其抽象基的实例

这就是析构函数的作用:如果您需要释放在抽象类的构造函数中分配的私有资源,那么唯一放置清理的地方就是它的析构函数

对于抽象类,是否有必要将析构函数设为纯虚拟类

class Base()  
{  
public:  
    virtual ~Base() = 0;  
}; 
Base :: ~Base()
{
}
class Derived :: public Base  
{  
public:  
    ~Derived();  
};
无需将析构函数标记为纯虚拟。只有在没有定义其他可以标记为纯虚拟的函数的情况下,才能执行此操作。在任何情况下,都必须为析构函数提供实现,即使将其标记为纯虚拟

我们不能创建抽象类的对象

这意味着抽象类本身无法实例化。但这并不意味着抽象类的对象不能被实例化为派生对象的一部分:任何派生类的实例也是其抽象基的实例

这就是析构函数的作用:如果您需要释放在抽象类的构造函数中分配的私有资源,那么唯一放置清理的地方就是它的析构函数

对于抽象类,是否有必要将析构函数设为纯虚拟类

class Base()  
{  
public:  
    virtual ~Base() = 0;  
}; 
Base :: ~Base()
{
}
class Derived :: public Base  
{  
public:  
    ~Derived();  
};
无需将析构函数标记为纯虚拟。只有在没有定义其他可以标记为纯虚拟的函数的情况下,才能执行此操作。在任何情况下,都必须为析构函数提供实现,即使将其标记为纯虚拟

为什么抽象类需要析构函数

为了释放整个类层次结构中使用的资源,它需要是虚拟的。还要使类成为抽象类,请参见下文

对于抽象,是否有必要将析构函数设为纯虚拟 上课

是的,只有在极少数情况下,您希望使类抽象,并且类内没有其他虚拟函数

关于纯虚析构函数的补充注记

必须为纯虚拟对象提供类外的定义 析构函数。 派生类不需要为析构函数提供定义。 为什么抽象类需要析构函数

为了释放整个类层次结构中使用的资源,它需要是虚拟的。还要使类成为抽象类,请参见下文

对于抽象,是否有必要将析构函数设为纯虚拟 上课

是的,只有在极少数情况下,您希望使类抽象,并且类内没有其他虚拟函数

关于纯虚析构函数的补充注记

必须为纯虚拟对象提供类外的定义 析构函数。 派生类不需要为析构函数提供定义。
如果您有一个指向抽象基类的指针并调用delete,那么它将调用派生类的析构函数,这就是为什么需要查看可能的重复项的原因。如果您创建了派生类,那么您也创建了一个基类。因此,和其他类一样,Base需要一个构造函数和析构函数。上面的代码中有很多错误。它不是一个有效的C++代码,不会编译。显然,你可以制作抽象类的对象。当你创建一个派生对象时,它包含一个基对象,这个基对象可能需要销毁。如果你有一个指向你的抽象基类的指针并调用delete,它将调用派生类的析构函数,这就是为什么如果你创建了一个派生对象,你也创建了一个基对象,那么它可能会重复。因此,和其他类一样,Base需要一个构造函数和析构函数。上面的代码中有很多错误。它不是一个有效的C++代码,不会编译。显然,你可以制作抽象类的对象。创建派生对象时,它包含一个基础对象,该基础对象可能需要销毁。