早教吧 育儿知识 作业答案 考试题库 百科 知识分享

分析构造函数和析构函数调用次序(1)类A是类B的基类,类B是类D的基类,类C是类B的对象成员,若定义类D的对象,分析各类的构造函数和析构函数的调用次序。(2)对于(1)的题,假设C类也从

题目详情
分析构造函数和析构函数调用次序
(1)类A是类B的基类,类B是类D的基类,类C是类B的对象成员,若定义类D的对象,分析各类的构造函数和析构函数的调用次序。
(2)对于(1)的题,假设C类也从类A派生,即类A同为B和C的基类,其余题意同上,分析定义类D的对象是,各类的构造函数和析构函数的调用次序。
(3)对于(2)题 ,假设类B和类C都虚拟继承于类A,分析定义类D的对象是,各类的构造函数和析构函数的调用次序。
▼优质解答
答案和解析
(1)
#include
using namespace std;
class A
{
public:
A()
{
cout <}
~A()
{
cout <}
};
class C
{
public:
C()
{
cout <}
~C()
{
cout <}
};
class B:public A
{
public:
C c;
B()
{
cout <}
~B()
{
cout <}
};
class D: public B
{
public:
D(){
cout <}
~D(){
cout <}
};
int main()
{
D d;
return 0;
}
输出:
constructing A
constructing C
constructing B
constructing D
Destructing D
Destructing B
Destructing C
Destructing A
(2)
#include
using namespace std;
class A
{
public:
A()
{
cout <}
~A()
{
cout <}
};
class C:public A
{
public:
C()
{
cout <}
~C()
{
cout <}
};
class B:public A
{
public:
C c;
B()
{
cout <}
~B()
{
cout <}
};
class D: public B
{
public:
D(){
cout <}
~D(){
cout <}
};
输出:
constructing A
constructing A
constructing C
constructing B
constructing D
Destructing D
Destructing B
Destructing C
Destructing A
Destructing A
(3)
#include
using namespace std;
class A
{
public:
A()
{
cout <}
~A()
{
cout <}
};
class C:virtual public A
{
public:
C()
{
cout <}
~C()
{
cout <}
};
class B:virtual public A
{
public:
C c;
B()
{
cout <}
~B()
{
cout <}
};
class D: public B
{
public:
D(){
cout <}
~D(){
cout <}
};
输出:
constructing A
constructing A
constructing C
constructing B
constructing D
Destructing D
Destructing B
Destructing C
Destructing A
Destructing A