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。这很有意义。类似于将所有构造函数设置为私有?私有构造函数阻止您继承,而不是实例化(例如从静态成员)