关于虚析构函数

chimes298 2014-09-02 12:03:48
#include <iostream>
using namespace std;

class Cbase
{
public:
Cbase() {cout<<"Cbase()"<<endl;}
~Cbase(){cout<<"~Cbase()"<<endl;}
virtual void display(){cout<<"B"<<endl;}
};

class Cchild: public Cbase
{
public:
Cchild() {cout<<"Cchild()"<<endl;}
~Cchild(){cout<<"~Cchild()"<<endl;}
void display(){cout<<"C"<<endl;}
};

main()
{
Cbase* pBase;
Cchild c;
pBase = &c;
}

代码在g++编译器上输出为:
Cbase()
Cchild()
~Cchild()
~Cbase()

析构函数并不是virtual,感觉应该只有Cbase的析构啊?为什么Cchild的析构也会有?
...全文
171 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
brookmill 2014-09-02
  • 打赏
  • 举报
回复
把包含pBase的两行代码删掉,结果不变。
默伊清风 2014-09-02
  • 打赏
  • 举报
回复
Cchild c;也产生对象了
brookmill 2014-09-02
  • 打赏
  • 举报
回复
构造函数和析构函数都是对于c的,pBase根本没用
盘子饿了 2014-09-02
  • 打赏
  • 举报
回复
c是临时变量,作用域结束时析构了,和虚函数没关系。
mujiok2003 2014-09-02
  • 打赏
  • 举报
回复
析构函数的调用顺序和构造函数调用顺序相反(假设你已经知道构造函数调用顺序)
mujiok2003 2014-09-02
  • 打赏
  • 举报
回复
引用 4 楼 truelance 的回复:
virtual是重载用的
谁告诉你的?
Snailwalker 2014-09-02
  • 打赏
  • 举报
回复
在派生类中, void display(){cout<<"C"<<endl;} 省略了virtual,也是虚函数,但是建议你加上,方便看代码的人阅读!基类和派生类的构造和析构函数的调用,刚好相反,在创建派生类对象的时候,会默认调用基类的默认构造函数!
边走边瞧 2014-09-02
  • 打赏
  • 举报
回复
该说的楼上几个都说清楚了,俺补充一点: 重载的时候,virtual关键字不写也是生效的。在你的例子里,CChild::display也是虚函数。
神奕 2014-09-02
  • 打赏
  • 举报
回复
创建一个派生类对象,需要创建 自己的部分(构造函数),也需要创建 基类部分(基类的构造函数)。同样,释放的时候需要销毁 自己的部分(析构函数) 和 基类部分(基类的析构函数)。。。 所以你这个例子只是 Cchild c; 在起作用。。。
勤奋的小游侠 2014-09-02
  • 打赏
  • 举报
回复
你没有搞清楚析构函数是什么,它的调用顺序又是什么。 你的例子和虚函数没有一点关系
lm_whales 2014-09-02
  • 打赏
  • 举报
回复
1)没有定义虚析构函数 2)展示的代码,只有构造函数,析构函数会被执行 这只是构造函数,析构函数执行顺序问题 PS: 各位解答,都很精彩,水平比我高,所以我就不多说了
熊熊大叔 2014-09-02
  • 打赏
  • 举报
回复
virtual是重载用的,没有重载,当然父子类的都要调
passion_wu128 2014-09-02
  • 打赏
  • 举报
回复
pBase是指针,又不是对象,离开main函数时又不会析构。
passion_wu128 2014-09-02
  • 打赏
  • 举报
回复
这个跟析构函数没有关系,你又没用多态。你写成下面这个样子会有同样的输出:

main()
{
        Cchild c;
}
记住一点就是了:构造时从基类依次向子类构造,析构时顺序相反。
Johnblx 2014-09-02
  • 打赏
  • 举报
回复
以上各楼的答案你可能没有听明白 给你列一个新的代码你可能就明白了 Base * pBase = new Driver ; delete * pBase; 如果是这样,就是你所猜想的那样

64,637

社区成员

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

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