码迷,mamicode.com
首页 > 其他好文 > 详细

构造以及析构函数的调用

时间:2016-04-21 22:05:04      阅读:144      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!