相关疑难解决方法(0)

何时使用虚拟析构函数?

我对大多数OO理论有了深刻的理解,但让我困惑的一件事是虚拟析构函数.

我认为无论什么以及链中的每个对象,析构函数总是会被调用.

你什么时候打算让它们成为虚拟的?为什么?

c++ polymorphism shared-ptr virtual-destructor

1420
推荐指数
13
解决办法
66万
查看次数

每个班级都应该有一个虚拟的析构函数吗?

Java和C#支持的,不能用作与基类类的概念 finalsealed关键字.但是,在C++中,如果每个类都有一个虚拟的析构函数,那么就没有什么好的方法可以防止类的派生出于某种困境而导致类被派生出来?


编辑:从C++ 11开始,这不再是真的,你可以指定一个类final.


一方面给一个对象一个虚拟析构函数意味着它将拥有一个vtable并因此消耗4个(或64位机器上的8个)每个对象的附加字节vptr.

另一方面,如果有人后来从这个类派生并通过指向基类的指针删除派生类,程序将是错误定义的(由于没有虚拟析构函数),并且坦率地优化每个对象的指针是荒谬.

在具有虚拟析构函数的抓握手上(可以说是)宣称这种类型意味着多态地使用.

有些人认为,你需要一个明确的理由不使用虚拟析构函数(如的潜台词这个问题)和其他人说,只有当你有理由相信,你的类是从派生你应该使用它们,有什么事认为?

c++ virtual-destructor

49
推荐指数
4
解决办法
4万
查看次数

有没有具体的理由使用非虚拟析构函数?

据我所知,任何指定具有子类的类都应该使用虚拟析构函数声明,因此在通过指针访问类实例时可以正确销毁它们.

但为什么甚至可以用非虚析构函数声明这样的类?我相信编译器可以决定何时使用虚拟析构函数.那么,它是一个C++设计监督,还是我错过了什么?

c++ language-design virtual-destructor

20
推荐指数
1
解决办法
3135
查看次数