c++派生类构造函数初始化

xiaoyuan6861 2008-10-18 08:41:13
#include<iostream>
using namespace std;
class B1
{
public:
B1(int i){cout<<"constructing B1"<<i<<endl;}//有参
};
class B2
{
public:
B2(int j){cout<<"constructing B2"<<j<<endl;}//有参
};
class B3
{
public:
B3(){cout<<"constructing B3 *"<<endl;}//有参
};

class C:public B2,public B1,public B3
{
public:
C(int a,int b,int c,int d):B1(a),memberB2(d),memberB1(c),B2(b){}
private:
B1 memberB1;
B2 memberB2;
B3 memberB3;
};
int main()
{
C obj(1,2,3,4);
}
肖源(359424480) 20:21:04
谁帮洒家解决下
肖源(359424480) 20:21:50
C(int a,int b,int c,int d):B1(a),memberB2(d),memberB1(c),B2(b){}这个构造函数顺序是怎么排的啊?
...全文
368 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyuan6861 2008-11-19
  • 打赏
  • 举报
回复
嗯,你说得对,不过楼上一位和你说法一样,我刚用csdn。那次评分不知道还能每个人都分点,抱歉哈。大家一起努力
xiaoyuan6861 2008-11-19
  • 打赏
  • 举报
回复
嗯,我已经知道了,不过还是谢谢大家
aaa97sese 2008-11-18
  • 打赏
  • 举报
回复
子类对象C obj(1,2,3,4)初始化时,其父(public B2,public B1,public B3 )的初始化行为会先于子类初始化行为而被计算机自动调用。
kkndciapp 2008-10-19
  • 打赏
  • 举报
回复
顺序是你这里声明的private:
B1 memberB1;
B2 memberB2;
B3 memberB3;
跟初始化表没有任何关系,楼主可以试下改变初始化表的顺序,可以发现结果不变,但是改变声明的顺序,结果会改变
xxzh1 2008-10-19
  • 打赏
  • 举报
回复
派生类构造函数传递的参数顺序可以是任意的,只要把所需的参数传递完就可以了。至于调用的顺序就是按照继承那的顺序,这里是class C:public B2,public B1,public B3 所以调用顺序为B2,B1,B3

wwwypy 2008-10-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zmlovelx 的回复:]
constructing B22
constructing B11
constructing B3 *
//首先是三个基类 class C:public B2,public B1,public B3
//然后是三个数据成员
//private:
// B1 memberB1;
// B2 memberB2;
// B3 memberB3;

调用顺序并不以
// C(int a,int b,int c,int d):B1(a),memberB2(d),memberB1(c),B2(b) 为顺序
constructing B13
constructing B24
constructing B3 *
[/Quote]顶
plusbug 2008-10-18
  • 打赏
  • 举报
回复
~~
pengyuchen86 2008-10-18
  • 打赏
  • 举报
回复
C(int a,int b,int c,int d):B1(a),memberB2(d),memberB1(c),B2(b){}这个构造函数的排列顺序不影响构造执行顺序。
这句的作用只是显示调用了对应基类和成员变量的构造函数。

构造执行顺序由指定基类时的顺序和成员变量在类的声明中的顺序决定。

例如上例:
class C:public B2,public B1,public B3
......
private:
B1 memberB1;
B2 memberB2;
B3 memberB3;

C的构造函数的调用顺序为B2(有参,b),B1(有参,d),B3(无参,*),B1(有参,c),B2(有参,d),B3(无参,*)的构造函数。
帅得不敢出门 2008-10-18
  • 打赏
  • 举报
回复
constructing B22
constructing B11
constructing B3 *
//首先是三个基类 class C:public B2,public B1,public B3
//然后是三个数据成员
//private:
// B1 memberB1;
// B2 memberB2;
// B3 memberB3;

调用顺序并不以
// C(int a,int b,int c,int d):B1(a),memberB2(d),memberB1(c),B2(b) 为顺序
constructing B13
constructing B24
constructing B3 *
qqwx_1986 2008-10-18
  • 打赏
  • 举报
回复
顺序为B1 B2 B3
顺序是按照派生类中申明的顺序初始化 和初始化列表无关

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧