//继承中的构造和析构
//继承和组合混搭情况下,构造函数、析构函数调用顺序研究
#include <iostream>
using namespace std;
class Object //爷爷
{
public:
Object(const char* s)//爷爷的构造函数
{
cout << "Object()" << " " << s << endl;
}
~Object()//爷爷的析构函数
{
cout << "~Object()" << endl;
}
};
class Parent : public Object //父亲
{
public:
Parent(const char* s) : Object(s)//继承爷爷,在调用父亲构造函数时,应该先调用
{
cout << "Parent()" << " " << s << endl;
}
~Parent()
{
cout << "~Parent()" << endl;
}
};
class Child : public Parent//儿子
{
protected:
Object o1;
Object o2;
public:
Child() : o2("o2"), o1("o1"), Parent("Parameter from Child!")
{
cout << "Child()" << endl;
}
~Child()
{
cout << "~Child()" << endl;
}
};
void run05()
{
Child child;
}
int main(int argc, char *argv[])
{
cout << "demo05_extend_construct_destory.cpp" << endl;
run05();
system("pause");
return 0;
}
接下来我来分析此代码
开始child对象创建将调用child构造函数,因为child继承了parent,所以在调用child之前先调用parent构造函数,又因为parent继承Object,所以在调用Parentt函数之前先调Object构造函数,调用完object函数,然后调用Parent函数,调用了Parent函数,好,这里因为在child类中的成员是两个object对象,因此调用完Parent类后,然后应该调用2个object对象的构造函数(注意这个和第一次调用不一样),最后再调用child构造函数
析构的顺序与构造顺序相反
先child析构,然后child中的成员析构,再parent析构最后Object(爷爷析构)
综合演练2
//继承中的构造和析构
//继承和组合混搭情况下,构造函数、析构函数调用顺序研究
#include <iostream>
using namespace std;
class Object
{
public:
Object(const char* s)//爷爷
{
cout << "Object()" << " " << s << endl;
}
~Object()
{
cout << "~Object()" << endl;
}
};
class Parent : public Object
{
public:
Parent(const char* s) : Object(s) //爸爸
{
cout << "Parent()" << " " << s << endl;
}
~Parent()
{
cout << "~Parent()" << endl;
}
};
class Child : public Parent//儿子
{
protected:
Object o1;
Object o2;
public:
Child() : o2("o2"), o1("o1"), Parent("Parameter from Child!")
{
cout << "Child()" << endl;
}
~Child()
{
cout << "~Child()" << endl;
}
};
void run05()
{
Child child;
}
int main(int argc, char *argv[])
{
cout << "demo05_extend_construct_destory.cpp" << endl;
run05();
system("pause");
return 0;
}
//此例子与上面例子一样,自己可以试着分析
通过这2个例子的讲解,大家应该对继承中析构与构造混搭有了一个了解了吧