社区
C++ 语言
帖子详情
析构函数可否声明为纯虚函数??
goodboyws
2003-10-20 02:09:01
如题
...全文
1735
19
打赏
收藏
析构函数可否声明为纯虚函数??
如题
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
bbcallen
2003-10-23
打赏
举报
回复
参见《Effective C++》 Item 14
"Make sure base classes have virtual destructors"
提到的使用情形是
When "you have a class that you'd like to be abstract,but you don't happen to have any function that are pure virtual."
mfs
2003-10-23
打赏
举报
回复
可以.
ipgk
2003-10-23
打赏
举报
回复
可以!!
析构函数是纯虚函数的亦为抽象类。
如楼上的例子所以错误,因为b继承a后没有改写a的纯虚函数,因此b也是抽象类,自然不能实例化。
修改如下则正确:
class a
{
public:
virtual ~a()=0;
};
class b:public a
{
public:
virtual ~b(){};
};
a::~a(){};//改写a的纯虚函数,此时a仍为抽象类
int main()
{
b bb;
return 1;
}
注意此时a仍为抽象类不能实例化,a aa则错误。
Yssss1980
2003-10-23
打赏
举报
回复
以下是在DEV C++测试结果
class a
{
public:
virtual ~a()=0;
};
class b:public a
{
public:
virtual ~b(){};
};
int main()
{
b bb;
return 1;
}
[Linker error] undefined reference to `a::~a()'
事实证明:不可以
alongfly
2003-10-23
打赏
举报
回复
涉及到派生,如果基类是抽象的类,其构造与析构要定义成虚基类。否则出错。
langzi8818
2003-10-23
打赏
举报
回复
0374--7127923
langzi8818
2003-10-23
打赏
举报
回复
只是它不能实例化了
ttlb
2003-10-23
打赏
举报
回复
同意 fierygnu(va_list)
不行
Jinhao
2003-10-23
打赏
举报
回复
完全可以,正如楼上兄弟所说,做成抽象类,如果不这样就有危险拉
zZing
2003-10-23
打赏
举报
回复
可以阿,就是用来做抽象类的
langzi8818
2003-10-23
打赏
举报
回复
可以啊,这是可以的,不仅可以设成虚函数,而且你可以在外面定义他
BenWong1981126
2003-10-23
打赏
举报
回复
试试看.......结果是可以的,呵呵
yonyon
2003-10-23
打赏
举报
回复
可以,但不常用。
引用一段:
因为很多类并不是被设计作为基类的。只有类在行为上是它的派生类的接口时(这些派生类
往往在堆中分配,通过指针或引用来访问),虚拟函数才有意义。
那么什么时候才应该将析构函数定义为虚拟呢?当类至少拥有一个虚拟函数时。拥有虚拟函
数意味着一个类是派生类的接口,在这种情况下,一个派生类的对象可能通过一个基类指针
来销毁。例如:
class Base {
// ...
virtual ~Base();
};
class Derived : public Base {
// ...
~Derived();
};
void f()
{
Base* p = new Derived;
delete p; // 虚拟析构函数保证~Derived 函数被调用
}
如果基类的析构函数不是虚拟的,那么派生类的析构函数将不会被调用——这可能产生糟糕
的结果,例如派生类的资源不会被释放。
Hot_Forever
2003-10-20
打赏
举报
回复
把析构函数声明为纯虚函数意味着这是一个抽象类,专门是用作基类的
fierygnu
2003-10-20
打赏
举报
回复
不行。因为派生类的析构函数会自动调用基类的析构函数,那样连接器会找不到基类的析构函数。
limd
2003-10-20
打赏
举报
回复
好像是不可以的
kissme1943
2003-10-20
打赏
举报
回复
析构函数可以声明成纯虚函数, 但一般不这样做
通常的做法是在想声明成纯虚函数的地方,用空的函数体代替
如 XXX::~XXX() { }
daizh
2003-10-20
打赏
举报
回复
不可以
Hot_Forever
2003-10-20
打赏
举报
回复
可以
MT5智能交易编程实战59课精讲
MT5基本功能介绍、MetaEditor编辑器、基本数据类型、常量和变量、枚举类型、结构体、数组、算数运算符、关系运算符、逻辑运算符、条件判断、循环、函数、类的定义、类的成员变量和函数、类的构造函数、类的
析构函数
...
C#系列课程面向对象篇
这个是继《C#系列课程之基础知识入门篇》的篇,主要讲解的是C#中面向对象的有关知识,主要有类,接口,继承,多态,构造函数,
析构函数
,密封类,属性,抽象,结构体,枚举,静态类,部分类等等有关面向对象的专业...
2023 C++零基础入门视频教程
第11章类与对象是C++的核心,本章的知识会比较多,会详细介绍类的各个知识点,名字空间、函数重载、构造函数、
析构函数
、深拷贝、浅拷贝、静态函数、继承、虚函数、多态、友元函数、友元类、运算符重载、类内存分析...
尹成Python27天入门到项目实战
算学费输入数据求最大精确划分思维解决最大次大交换数据实现按行显示围棋棋盘绘制国际象棋绘制为什么要用函数函数的四种类型函数的一般形式必须用函数的理由-哥德巴赫函数的本质就是地址函数变量意义函数变量用途...
FFmpeg音视频基础之C++系列第1:C++入门经典第10版
析构函数
8410.7 重载赋值(=)操作符 84第11章 友元函数、重载操作符和数组 8611.1 友元函数 8711.2 重载操作符 8811.3 数组和类 9111.4 类和动态数组 ...
C++ 语言
64,652
社区成员
250,508
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章