在继承中面临一个问题就是:我们的基类和派生类都有各自的构造函数和析构函数,那么再实例化派生类成员的时候,这个构造析构的顺序是怎么样的呢?
class Animal
{
public:
Animal()//构造函数
{
cout << "constring Animal" << endl;
}
~Animal()
{
cout << "destructing Animal" << endl;
}
void setm(int a = 0)
{
age = a;
}
int getage()
{
return age;
}
private:
int age;
};
我们构造了个动物类,我们需要继续构造类来实现动物
class Dog:public Animal
{
public:
void setd(int a)
{
setm(a);
}
Dog()
{
cout << "constructing Dog" << endl;
}
~Dog()
{
cout << "destorying Dog" << endl;
}
};
观察这段代码,我们的动物类有自己的构造方法和析构方法,当然狗类也有,我们来看调用顺序。
Dog d;
d.setd(2);
出现结果
这里我们指明,继承不会继承基类的构造函数,在创建这个d对象的时候,系统只会执行派生类的构造函数,不会执行基类的构造函数,如果基类的构造函数包含对变量的初始化,建立派生类对象的时候,要考虑派生类所增加的变量的初始化,也要考虑基类变量的初始化。
当基类的构造函数有带参数的构造函数的时候,派生类的构造函数必须声明所有的参数。
当基类构造函数不带参数时,派生类不一定需要定义构造函数,然而当基类的构造函数至少一个参数,它所有的派生类都不必须定义构造函数。