【问题标题】:What does the operator '~' do when it is beside a method and what is a pure virtual method for?运算符“~”在方法旁边时做什么?纯虚方法是做什么用的?
【发布时间】:2016-03-12 01:37:56
【问题描述】:

示例代码:

#include <string>

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

    protected:
        int a;
    };
}

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

virtual method() = 0;

我们为什么需要这个?

【问题讨论】:

  • 那不是not运算符,你需要读一个book
  • 哈哈 没错,我只是在这里太懒了。它就在课堂章节的第一页。在java中编码时从未见过这一点。但话虽如此,我想说的是没有愚蠢的问题。
  • 您可以在基类中使用纯虚拟。当基类可能无法“知道”要做什么或返回什么时使用它,但需要该方法。派生类将实现自己的版本。如果他们不这样做,则无法实例化该类的对象。例如基类 Vehicle 有一个方法 Move。派生的飞机飞行和汽车驱动器。

标签: c++ operators virtual


【解决方案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'的无效新表达式

注意:因为以下虚函数在“Derived”中是纯函数:

struct Derived : Base

纯虚函数用于描述接口。

关于虚拟析构函数:

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

客户端创建 Derived 的实例:

Base *instance = new Derived;

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

delete instance;

让我们跟踪调用:

派生的析构函数

基础析构函数

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

基础析构函数

你可以看到 Derived 的 descturtor 没有被调用,所以存在内存泄漏(Derived 类的数组没有被释放)。

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

【讨论】:

    【解决方案2】:

    虚拟~Vehicle();

    波浪号~ 表示析构函数。它是一种方法,一种用于销毁对象的特殊方法。

    在抽象基类中使用虚析构函数。

    虚方法() = 0;

    那是纯虚函数。表示你必须为实现这个抽象基类的实现类提供实现method

    【讨论】:

      猜你喜欢
      • 2010-10-17
      • 2011-01-18
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 2013-08-08
      • 2020-02-07
      • 1970-01-01
      相关资源
      最近更新 更多