标签:
说明以下程序的显示结果:
#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