P*******b 发帖数: 1001 | 1 if a base does NOT have any virtual function, do we need the destructor be v
irtual?
why? |
e*****m 发帖数: 320 | 2 virtual destructor的作用是动态释放类实例化过程中可能产生的资源分配问题,这个
跟有没有虚函数应该没有因果关系,只跟类内部的资源分配有关系
所以答案是yes,it is always right to declare a destructor virtual.
我可以给你举个例子,等会我把代码和分析贴上来 |
p**********s 发帖数: 115 | 3 NODNOD~
【在 e*****m 的大作中提到】 : virtual destructor的作用是动态释放类实例化过程中可能产生的资源分配问题,这个 : 跟有没有虚函数应该没有因果关系,只跟类内部的资源分配有关系 : 所以答案是yes,it is always right to declare a destructor virtual. : 我可以给你举个例子,等会我把代码和分析贴上来
|
f**********w 发帖数: 93 | 4 如果没有其他的virtual method,没有必要声明destructor virtual。因为这样会增加
额外的object空间开销,多了一个指向vtable的指针。 |
f****4 发帖数: 1359 | 5 应该这么问:
没有别的 virtual method,同时没有用new动态分配过资源,还有必要把destructor定
义成virtual么? |
P*******b 发帖数: 1001 | 6 如果有人继承了这个类并不巧在不知道的情况下用了类似dynamic binding的用法呢?
【在 f**********w 的大作中提到】 : 如果没有其他的virtual method,没有必要声明destructor virtual。因为这样会增加 : 额外的object空间开销,多了一个指向vtable的指针。
|
m****w 发帖数: 372 | 7 这个virtrual destructor 的定义与否,depending on if this class is designed
to be a BASE class, not depending on if class contains virtual function.
(BASE class may or may not contain virtual function)
(from another point of view, if a class contains virtual function, then it
is designed as a base class, it needs VDes.)
eff. c++ Item7的第二部分,Meyers 从编译器优化的角度说明, if one class is
not designed as BASE class, it should not have Vdes. |
M********5 发帖数: 715 | 8
你说的很正确,所以先前那个人说没有virtual function就不要定义virtual
destructor的说法
是不正确的
【在 P*******b 的大作中提到】 : 如果有人继承了这个类并不巧在不知道的情况下用了类似dynamic binding的用法呢?
|
M********5 发帖数: 715 | 9
前面说要举的例子就是这样子的:
Base中有分配内存,Derived也有分配内存,如果我们有一个指针指向动态分配的
Derived,然后再
把这个指针赋值给指向Base的指针,然后delete指向Base的指针,就会出现内存泄露!
Base *pb;
Derived *pd = new Derived;
pb = pd;
delete pb; //这里就会出现内存泄露的问题
我想我这样解释不知道大家是否明白
【在 P*******b 的大作中提到】 : 如果有人继承了这个类并不巧在不知道的情况下用了类似dynamic binding的用法呢?
|
f*********5 发帖数: 576 | 10 你的意思说为了避免个别人的错误让所有使用者都降低效率?
【在 P*******b 的大作中提到】 : 如果有人继承了这个类并不巧在不知道的情况下用了类似dynamic binding的用法呢?
|
M********5 发帖数: 715 | 11
他应该不是这个意思,而是说,基类函数的destructor一般都定义为virtual
另外加我自己的一个观点,如果说有可能有client用错,那我觉得宁愿牺牲存储空间,
也要保证正确
率。因为发生内存泄露其实是一件很危险的事情
【在 f*********5 的大作中提到】 : 你的意思说为了避免个别人的错误让所有使用者都降低效率?
|
a****n 发帖数: 1887 | 12 父类的析构函数为共有虚函数, 或者保护非虚函数 |
f**********w 发帖数: 93 | 13 如果基类没有任何virtualmethod, 为什么要做指针的转换呢?这种情况不存在任何的
多态,在我看来,错误应该是指针转换本身,而不是有或没有virtual destructor。举
个例子
如果我们在derived class 里定义了一个新的method,如果我们把指针转换成基类指针
,然后用基类指针调用derived class method,一样会导致错误。The responsibility
is on the client side to make sure they do not do downcast if base class
does not contain any virtual method.
【在 M********5 的大作中提到】 : : 他应该不是这个意思,而是说,基类函数的destructor一般都定义为virtual : 另外加我自己的一个观点,如果说有可能有client用错,那我觉得宁愿牺牲存储空间, : 也要保证正确 : 率。因为发生内存泄露其实是一件很危险的事情
|