菜鸡申请bb两句O_o
1、知识点肯定是面向对象啦,特性什么抽象、封装、继承、多态的,这个就是继承时父类和子类的构造和析构顺序
2、看问题,程序运行肯定是从main函数开始的,main中实例化了一个对象,类CD的对象CDobj
3、看CD类,CD继承CB,CC (知识点多继承)。看CD的构造函数(对应main里实例化时用的就是CD(int ,int,int,int))
4、CD构造函数运行时,调用了CC(n3,n4)和CB(n2)的构造函数
5、CC构造函数中,调用了CA(套娃么不是)
6、CB就被调用了一下,没有干其他的了。
看构造顺序,多继承方式下派生类(子类)的构造函数必须同时对该派生类所有基类(父类)的构造函数进行调用
调用顺序:先调用所有基类的构造函数,再调用派生类中的构造函数。(注意:处于同一层次的各个基类的调用顺序,取决于派生类所指定的基类顺序,与派生类构造函数中所定义的成员初始化列表顺序无关)。
析构顺序:先构造的后析构,后构造的先析构
就酱~
程序中定义了4个类 CA、CB、CC、CD。类 CC 继承了类 CA,类 CD 同时继承了类 CB 和 CC。
类 CA 和 CB 都有一个构造函数和析构函数,分别在创建和销毁对象的时候会被调用。而类 CC 继承了类 CA,它也有自己的构造函数和析构函数,并在构造函数中调用了类 CA 的构造函数。
类 CD 继承了类 CB 和 CC,它也有自己的构造函数和析构函数。在构造函数中,先调用类 CC 的构造函数,再调用类 CB 的构造函数,最后初始化自己的 d 成员变量。在程序的最后,创建了一个 CD 类型的对象 CDobj。
运行程序后,会输出以下结果:
CA::a=8 CC::c=6 CB::b=4 CD::d=2 CDobj is destructing. CBobj is destructing. CCobj is destructing. CAobj is destructing.
调用过程:
程序从 main() 函数开始执行,创建了一个名为 CDobj 的 CD 类型的对象。当对象被创建时,会按照构造函数的参数列表调用不同的构造函数。
在这个例子中,CD 类的构造函数的第一个参数是 n1,即 2;第二个参数是 n2,即 4;第三个参数是 n3,即 6;第四个参数是 n4,即 8。
所以,先会调用类 CC 的构造函数,传递参数 n3 和 n4,即 6 和 8;类 CC 的构造函数又会调用它的基类 CA 的构造函数,同样传递参数 n2,即 8。此时,类 CA 的构造函数会输出 CA::a=8。
接下来,会继续执行类 CC 的构造函数,输出 CC::c=6。
然后,会调用类 CB 的构造函数,传递参数 n2,即 4,输出 CB::b=4。
最后,在类 CD 的构造函数中,将参数 n1 赋值给了成员变量 d,即 d=2,输出 CD::d=2。
当程序运行结束时,会从 main() 函数返回,并开始执行对象的析构函数,按照构造函数的调用顺序逆序调用析构函数。
所以,会先调用类 CD 的析构函数,输出 CDobj is destructing.。然后,会调用类 CB 的析构函数,输出 CBobj is destructing.。接着,会调用类 CC 的析构函数,输出 CCobj is destructing.。最后,调用类 CA 的析构函数,输出 CAobj is destructing.。整个过程中没有出现异常情况,程序运行顺利结束。