Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为纯虚拟析构函数添加定义的目的是什么?_C++_Destructor_Pure Virtual - Fatal编程技术网

C++ 为纯虚拟析构函数添加定义的目的是什么?

C++ 为纯虚拟析构函数添加定义的目的是什么?,c++,destructor,pure-virtual,C++,Destructor,Pure Virtual,灵感来自: 下面的代码实际上是做什么的 class Object { public: virtual ~Object() = 0; }; Object::~Object() { /*...*/ } 我认为纯虚函数的意义在于强制子类实现该特定函数。如果是这种情况,那么为什么还要在虚拟基类中实现相同的函数呢?此代码阻止您创建对象的实例,同时允许您创建子类 销毁对象时,将调用父类的析构函数,因此它必须存在。这适用于析构函数是否为纯虚函数。纯虚拟成员函数只需要在显式调用时定义,Foo

灵感来自:

下面的代码实际上是做什么的

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

Object::~Object() { /*...*/ }

我认为纯虚函数的意义在于强制子类实现该特定函数。如果是这种情况,那么为什么还要在虚拟基类中实现相同的函数呢?

此代码阻止您创建对象的实例,同时允许您创建子类


销毁对象时,将调用父类的析构函数,因此它必须存在。这适用于析构函数是否为纯虚函数。纯虚拟成员函数只需要在显式调用时定义,
Foo:theFunc()

对于纯虚拟析构函数,无法“强制”任何人在派生类中实现它。编译器将为您编写一个。此外,编译器编写的析构函数(在派生类中)将调用父析构函数-因此您最好为父析构函数编写一个实现

因此,总结一下:

  • 非析构函数的纯虚拟函数不需要实现,因为您不希望程序员调用它
  • 纯虚拟析构函数必须有一个实现,因为编译器必须从子类中的析构函数(程序员和编译器编写的)调用它

  • 我不能评论纯虚拟析构函数,但一般来说,纯虚拟函数的定义提供了默认实现,派生类可以显式选择执行它@纳瓦兹:那是虚拟函数。我很少实现纯虚拟函数,而且在过去十年中肯定没有实现过。除了纯虚拟析构函数,它总是必须实现。@sbi:我说的是派生函数可以选择运行的纯虚拟函数@纳瓦兹:无论如何,我认为调用基类虚拟软件时,即使不纯净,也会调用它们。您必须在自己的实现之前还是之后调用它?还是在中间?还是你必须这么做?我完全赞成。那太容易了。鉴于此,实现的纯虚拟函数的用例是什么?谢谢,Erik。这很有意义。类似于将所有构造函数设置为私有?私有构造函数阻止您继承,而不是实例化(例如从静态成员)