#include <iostream>
#include <vector>
using namespace std;
class Organisms
{
public:
Organisms()
{
cout<<"Organisms constructor"<<endl;
}
~Organisms()
{
cout<<"Organisms distructor"<<endl;
}
};
class Animal: public Organisms
{
public:
Animal()
{
cout<<"Animal constructor"<<endl;
}
~Animal()
{
cout<<"Animal distructor"<<endl;
}
};
class Person: public Animal
{
public:
Person() {
cout<<"Person constructor"<<endl;
}
~Person() {
cout<<"Person distructor"<<endl;
}
};
int main()
{
Animal* p = new Person;
delete p;
getchar();
return 0;
}
结果是:
Organisms constructor
Animal constructor
Person constructor
Animal distructor
Organisms distructor
可以看出 创建实例时,构造函数调用顺序是: 基类的无参数构造函数--->子类无参数构造函数 (基->子)
而销毁对象时,析构函数调用顺序是: 子类无参数析构函数--->基类的无参数析构函数 (子->基)
但是如果销毁对象时是用基类类型指针,那么就不会调用子类的析构函数了,就像上面看到的结果,这就很有可能出问题。
从这里也可以看出,如果系统某个类可以被继承,请保证有无参数的构造函数。这两种情况都可以:
1. 不定义任何构造函数 (默认构函数就是无参数的)。
2. 自定义无参数构造函数。
事实上在c++中应该为任何类都应该提供无参数构造函数,这可是一个好习惯。