问题标签 [virtual-destructor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 为什么要在 C++ 中为抽象类声明虚拟析构函数?
我知道在 C++ 中为基类声明虚拟析构函数是一个好习惯,但是virtual
即使对于充当接口的抽象类,声明析构函数也总是很重要吗?请提供一些原因和例子。
c++ - 什么时候不应该使用虚拟析构函数?
是否有充分的理由不为类声明虚拟析构函数?你什么时候应该特别避免写一个?
c++ - 每个类都应该有一个虚拟析构函数吗?
Java 和 C# 支持不能使用 final
andsealed
关键字作为基类的类的概念。然而,在 C++ 中,没有很好的方法来防止派生一个类,这让类的作者陷入两难境地,每个类都应该有一个虚拟析构函数吗?
编辑:由于 C++11 这不再是真的,你可以指定一个类是final
.
一方面,给一个对象一个虚拟析构函数意味着它将有一个vtable
,因此每个对象会消耗 4 个(或 64 位机器上的 8 个)额外字节vptr
。
另一方面,如果后来有人从这个类派生并通过指向基类的指针删除派生类,则程序将是错误定义的(由于没有虚拟析构函数),坦率地说,为每个对象优化一个指针是荒谬的。
在具有虚拟析构函数的抓手上(可以说)表明这种类型旨在以多态方式使用。
有些人认为你需要一个明确的理由不使用虚拟析构函数(这是这个问题的潜台词),而另一些人则说只有当你有理由相信你的类将派生自你时才应该使用它们,你是什么思考?
c++ - 何时使用虚拟析构函数?
我对大多数理论都有扎实的理解,OOP
但让我很困惑的一件事是虚拟析构函数。
我认为析构函数总是被调用,不管是什么,对于链中的每个对象。
你打算什么时候把它们变成虚拟的,为什么?
c++ - C++ 中的虚拟默认析构函数
我有大量继承自基类(标准)的继承类(标准)。这criterion
是代码
从这个派生类的一些例子:
由于我这里根本没有析构函数,但这应该是一个基类,我是否需要插入一个空的虚拟析构函数,即像这样?:
如果需要该虚拟析构函数声明,是否所有中间类也需要一个?即上面的fastFilter是否也需要一个虚拟析构函数?
c++ - 关于纯虚析构函数的问题
如果我们定义一个具有纯虚析构函数的抽象类,为什么我们必须在抽象类中定义析构函数?
c++ - 类 COM 接口警告非虚拟析构函数
有没有办法告诉 gcc 它正在编译的抽象类不需要虚拟析构函数(就像 COM 对象从来没有一样)?例如 nsISupports 总是抱怨缺少虚拟析构函数。关闭警告无济于事,因为我可能有非 COM 类,我想要这个警告。
因此 __attribute__((com_interface)) 已被弃用,仅更改了 vtable 布局。是否还有另一个 __attribute__ 可以告诉编译器我不想被警告该类缺少析构函数?
c++ - 你的析构函数什么时候应该是虚拟的?
可能重复:
何时使用虚拟析构函数?
你的 C++ 对象的析构函数应该是什么时候virtual
?
c++ - 有没有自动化的方法来实现构造函数后和析构函数前的虚拟方法调用?
由于从构造函数和析构函数内部调用虚方法的众所周知的问题,我通常最终得到的类需要在其构造函数之后调用最终设置方法,并在其之前调用预拆卸方法析构函数,像这样:
这是可行的,但它带来了调用者会忘记在适当的时间调用其中一个或两个方法的风险。
所以问题是:在 C++ 中有没有办法让这些方法被自动调用,所以调用者不必记住调用它们?(我猜没有,但我想我还是会问一下,以防万一有一些聪明的方法可以做到)
c++ - 具体类的析构函数
准则 #4链接文本,状态:
基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的。
可能我遗漏了一些东西,但是如果我只是创建一个具体的类,它不是设计为用作基类的。
我应该声明它是公共的和虚拟的析构函数吗?通过这种方式,我隐含地声明我的类“已准备好用作基类”,虽然这不是必须的。