首页 > 其他 > 详细

构造以及析构函数的调用

时间:2016-04-21 22:02:54      阅读:257      评论:0      收藏:0      [点我收藏+]

说明以下程序的显示结果:

#include <iostream>
using namespace std;

class A
{
public:
A() {hello();}
~A() {hello();}
virtual void hello()
{
cout<<"Hello A"<<endl;
}
};

class B:public A
{
public:
B() {hello();}
virtual void hello()
{
cout<<"Hello B"<< endl;
}
};

int main()
{
A *ptr = (A *)new B();
//B *ptr = new B();
ptr->hello();
delete ptr;
return 0;
}

 

显示结果:

Hello A
Hello B
Hello B
Hello A

 

解析:

A *ptr = (A *)new B();一句:初始化B类的时候先调用其父类(A)的构造函数,再调用B类的构造函数

ptr->hello();一句:ptr指向的是B类,尽管ptr本身是A*类型的指针,但还是调用B类的hello()函数

delete ptr;一句:B类没有定义析构函数,只调用A类的析构函数,这里即使B类定义了析构函数也不会被调用,除非在A类的析构函数前加上virtual

 

附别人的讲解:http://www.cnblogs.com/findumars/archive/2013/10/08/3357626.html

主要结论:

删除子类指针,无论如何会自动调用祖先类的析构函数(即使祖先类的习惯函数不是虚拟的)

自己类型的指针指向自己的对象,怎么样都没有问题(不管父类析构函数写不写virtual)。只有基类指针指向子类对象的时候,一定需要virtual关键字的配合,才能正确的工作

构造以及析构函数的调用

原文:http://www.cnblogs.com/dengnilikai/p/5418788.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!