c++构造函数的调用顺序

来源:互联网 发布:nginx lua 变量 编辑:程序博客网 时间:2024/06/05 09:24

这里主要讲的是,多层继承时,构造函数的调用:

我分为两类,

1.一般的多层继承,如:

class A
{
public:
int s;
A(int a)
{
cout<<"A()"<<endl;
}
};




class B: public A
{
public:
int s;
B(int a):A(a)//因为基类A没有无参构造函数,所以需要通过初始化列表来调用基类的构造函数,否则构造子类对象时,编译出错,原因是匹配不到基类的构造函数,如果基类A有无参构造函数,那么可以不必同过初始化列表来调用基类构造函数,会默认调用基类无参构造。
{
cout<<"B()"<<endl;
}
};




class C: public A
{
public:
int s;
C(int a):A(a)//同上
{
cout<<"C()"<<endl;
}
};




class D:public B,public C
{
public:
int s;
D(int a):B(a),C(a)//同上,这里不能写A(a),因为类D的直接基类是B和C没有A。
{
cout<<"D()"<<endl;
}
};


int main()
{
D d(10);
system("pause");
return 0;
}

程序运行的结果:

A()

B()

A()

C()

D()

说明:再构建对象d时,需要构建其直接基类对象B和C,而构建对象B时,又需要构建他的基类A,构建对象C时,要先构建父类A,所以才有以上结果


2.虚继承时;

概念:为了解决从不同路径继承来的同名的数据成员,造成二义性问题,将共同的基类设置成虚基类,这是从不同路径继承来的数据成员只有一份虚基类成员

虚基类关键字的作用域只对其后的基类起作用。

例子

class A
{
public:
int s;
A(int a)
{
cout<<"A()"<<endl;
}
};




class B:virtual public A
{
public:
int s;
B(int a):A(a)//因为基类没有无参构造函数,所以需要通过初始化列表来调用基类的构造函数,否则构造子类对象时,编译出错,原因是匹配不到基类的构造函数
{
cout<<"B()"<<endl;
}
};




class C:virtual public A
{
public:
int s;
C(int a):A(a)//同上
{
cout<<"C()"<<endl;
}
};




class D:public B,public C
{
public:
int s;
D(int a):B(a),A(a),C(a)//同上,这里必须写A(a),因为类D的直接基类B和C是虚继承A,必须在此先构造,之后构造B和C对象时都基于此构造的虚基类,不会再调用A的构造函数了,虚继承在所有路径派生类中只会有一份虚基类的成员。
{
cout<<"D()"<<endl;
}
};


int main()
{
D d(10);
system("pause");
return 0;
}

运行结果:

A()

B()

C()

D()


原创粉丝点击