当运算符在方法旁边时,运算符'~'做什么,纯虚拟方法的用途是什么?

What does the operator '~' do when it is beside a method and what is a pure virtual method for?

本文关键字:方法 运算符 虚拟 是什么 什么      更新时间:2023-10-16

示例代码:

#include <string>
namespace vehicle
{
    class Vehicle
    {
    public:
        Vehicle(int a);
        virtual ~Vehicle();   <------ not method?
    protected:
        int a;
    };
}

另外,我不完全理解纯虚拟方法的概念,您将方法声明为:

virtual method() = 0;

我们为什么需要这个?

假设有两个类:BaseDerived

struct Base
{
    Base() {}
    virtual void foo() = 0;
    virtual ~Base()
    {
        std::cout << "Base descructor" << std::endl;
    }
};
struct Derived : Base
{
    int *i;
    Derived(int i_): Base(), i(new int[i_]) {}
    virtual void foo() override
    {
        std::cout << "foo" << std::endl;
    }
    virtual ~Derived()
    {
        std::cout << "Derived descructor" << std::endl;
        delete [] i;
    }
};

纯虚函数

如果Derived不重写foo函数,则可以创建Derived类的实例。当你尝试时,你的代码将无法编译,因为foo是一个纯虚函数

错误:抽象类类型"派生"的新表达式无效

注意:因为以下虚函数在"派生"中是纯的:

struct Derived : Base

纯虚函数用于描述接口。

现在关于虚拟析构函数:

~ (tilda) 符号用于表示类析构函数。它 是在销毁对象时调用的特殊方法。

客户端创建派生的实例:

Base *instance = new Derived;

然后以某种方式使用此变量,当您不需要该变量时,您需要释放内存:

delete instance;

让我们跟踪调用:

衍生脱壳器

底座除尘器

因此,您可以看到调用了基本析构函数和派生析构函数,并且不存在内存泄漏。但是,如果您从析构函数中删除此virtual关键字

底座除尘器

如您所见,没有调用 Derived 的 descturtor,因此存在内存泄漏(Derived 类的数组不会被释放)。

因此,当您

通过指针处理对象时,虚拟构造函数很有用。

虚拟 ~车辆();

波浪号~表示析构函数。这是一种方法,一种销毁物体的特殊方法。

虚拟析构函数用于抽象基类。

虚拟方法() = 0;

这是纯粹的虚函数。它指示您必须为实现此抽象基类的实现类提供实现method