VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4852|回复: 32

关于virtual的析构函数

[复制链接]

1

主题

13

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2021-3-8 18:30:01 | 显示全部楼层 |阅读模式

加virtual是为了继承来多态的

不是说析构函数不能被继承吗?
回复

使用道具 举报

0

主题

41

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2021-3-8 18:45:02 | 显示全部楼层
是为了使用基类指针就能够将派生类对象删除
回复

使用道具 举报

1

主题

13

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2021-3-8 19:00:01 | 显示全部楼层
没明白楼上的话-_-b

我再把问题说清楚一点:
virtual是给那些可以被继承的函数用来实现多态的,而析构函数本来就不能被继承啊!
回复

使用道具 举报

0

主题

49

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2021-3-8 19:15:01 | 显示全部楼层
如果析构函数不用virtual,则
Base *p = new Derive();
delete p;
这里delete p删除的就是Derive类中的Base成份了,而对于Derive成员则无法删除,所以为了正确删除,则必须用virtual析构函数,具体请参考effective c++ 3td
回复

使用道具 举报

0

主题

49

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2021-3-8 19:30:01 | 显示全部楼层
条款七
回复

使用道具 举报

0

主题

9

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2021-3-8 19:45:01 | 显示全部楼层

C++对象的结构中,如果有虚函数,就会有一个虚函数表,这个大家都知道,而析构函数会放在虚函数表的第二个索引位置,第一个索引位置是放type_info的,用来支持RTTI.不管是什么类,都是如此.析构函数的多态和普通函数不同,而且每个类只有一个析构,这能保证多态的调用条件,它本身就不是用继承来实现的,所以你不用觉得奇怪.
回复

使用道具 举报

0

主题

9

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2021-3-8 20:15:01 | 显示全部楼层
A Pure Virtual Destructor

Unlike ordinary member functions, a virtual destructor is not overridden when redefined in a derived class. Rather, it is extended: the lower-most destructor first invokes the destructor of its base class and only then, it is executed. Consequently, when you try to declare a pure virtual destructor, you may encounter compilation errors, or worse: a runtime crash. However, there's no need to despair--you can enjoy both worlds by declaring a pure virtual destructor without a risk. The abstract class should contain a declaration (without a definition) of a pure virtual destructor:

//Interface.h file
class Interface {
public:
        virtual ~Interface() = 0; //pure virtual destructor declaration
};

Somewhere outside the class declaration, the pure virtual destructor has to be defined like this:

//Interface.cpp file
Interface::~Interface()
{} //definition of a pure virtual destructor; should always be empty

这段文字应该说得比较清楚了
回复

使用道具 举报

1

主题

13

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2021-3-8 20:45:01 | 显示全部楼层
E文不好,楼上费心了。

问题又来了,既然在析构函数前加virtual不是为了让子类继承,
1>>>>那加它作什么?
2>>>>难道说加了virtual之后,子类的析构函数就加入到 虚函数表 中了?(此时基类,子类析构函数都调用)
而不加virtual,子类就不加入虚函数表,也就在最后不被调用?(此时只调用基类的析构函数)
回复

使用道具 举报

1

主题

13

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2021-3-8 21:00:01 | 显示全部楼层
补充一下,我知道加virtual是为了防止在通过基类指针析构时,子类定义的成员内存不被释放
回复

使用道具 举报

1

主题

13

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2021-3-8 21:15:01 | 显示全部楼层
但现在就是不知道为什么这样做可以
防止在通过基类指针析构时,子类定义的成员内存不被释放
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表