运算符'〜'在方法旁边做什么,什么是纯虚方法?

时间:2016-03-12 01:37:57

标签: c++ operators virtual

示例代码:

#include <string>

namespace vehicle
{
    class Vehicle
    {
    public:
        Vehicle(int a);
        virtual ~Vehicle();   <------ not method?

    protected:
        int a;
    };
}

另外,我没有完全理解纯虚方法的概念,你将方法声明为:

virtual method() = 0;

为什么我们需要这个?

2 个答案:

答案 0 :(得分:1)

  

虚拟〜车辆();

代字号~表示析构函数。这是一种方法,一种破坏对象的特殊方法。

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

  

虚方法()= 0;

这是纯粹的虚拟功能。它表示您必须为实现此抽象基类的实现类提供实现method

答案 1 :(得分:1)

我们假设有两个类: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纯虚函数

  

错误:抽象类类型'Derived'

的new-expression无效      

注意:因为以下虚拟函数在'Derived'中是纯粹的:

struct Derived : Base

纯虚函数用于描述接口。

现在关于虚拟析构函数:

  

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

客户端创建Derived的实例:

Base *instance = new Derived;

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

delete instance;

让我们跟踪电话:

  

派生的descructor

     

Base descructor

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

  

Base descructor

正如您所看到的,Derived的descturtor未被调用,因此存在内存泄漏(Derived类的数组不会被释放)。

因此,当您通过指针处理对象时,虚拟构造函数非常有用。