析构函数可否声明为纯虚函数??

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
  • 打赏
  • 举报
回复
可以

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧