C++子类构造函数调用的一个问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++子类构造函数调用的一个问题相关的知识,希望对你有一定的参考价值。
#include <iostream.h>
class A
public:
A()cout<<"A's con."<<endl;
~A()cout<<"A's des."<<endl;
;
class B
public:
B()cout<<"B's con."<<endl;
~B()cout<<"B's des."<<endl;
;
class C: public A, public B
public:
C():member(),B(),A()
cout<<"C's con."<<endl;
~C()
cout<<"C's des."<<endl;
private:
B member;
;
void main() C obj;
怎么调用之后结果输出是:A's con.
B's con.
B's con.
C's con.
C's des.
B's des.
B's des.
A's des.
而不是:
A‘s con;
A's con;
B's con;
b's con;
c's con;
C's des.
B's des.
A's des.
A()与B()属于基类的构造函数,member()属于内嵌对象的构造函数.
然后搞清楚三个顺序:
1.
基类构造函数的调用顺序:按照它们被继承时声明的顺序,
class C: public A, public B,所以这里是先 A 后 B,即
先调用A(),再调用
B()
2.
内嵌成员对象的构造函数的调用顺序:按照它们在类中声明的顺序,因为只有一个内嵌对象 B member,所以调用的是B(),假设有两个对象在类 C 中声明如下:
B member;
A member_A;
则先调用 B(),再调用 A(),你可以多加一个这样的变量看看是不是这样.
3.
派生类构造函数执行的次序:
(1)调用基类的构造函数
(2)调用内嵌成员对象的构造函数
(3)派生类的构造函数
所以,按照以上所讲顺序调用如下:
(1)先 A(),再 B()
(2)B()
(3)最后C()
关于析构函数,只有一句话:
它的的执行次序与构造函数正好严格相反.
请注意--严格--二字,所以其顺序为:
~C()~B()~B()~A()
希望对你有所帮助^_^ 参考技术A 学习。
楼上的写的太好了,简洁明了
以上是关于C++子类构造函数调用的一个问题的主要内容,如果未能解决你的问题,请参考以下文章
在 c++ 中的菱形问题中,为啥我们需要从子类中调用祖父构造函数?