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()
- 【c++】构造函数调用顺序的研究
- 构造函数的调用顺序
- 看C++中构造函数的调用顺序
- 构造函数调用顺序
- 构造函数调用顺序
- 构造函数调用顺序
- 构造函数调用顺序
- 关于构造函数的调用顺序
- 类的构造函数调用顺序是什么?
- 关于构造函数的调用顺序
- Java构造函数的调用顺序
- 派生类构造函数的调用顺序
- 关于构造函数的调用顺序
- C++ 全局构造函数调用的顺序
- C++构造函数的调用顺序
- 派生类构造函数的调用顺序
- java继承的构造函数调用顺序
- 构造函数、初始化列表的调用顺序
- php生成不重复的随机数
- 云栖精选8月刊丨最全2016云栖大会资料大放送!技术精彩值得打call!
- 网页在浏览器中的title前面的小图标小ico
- 编写README.md文档
- [论文研读]主题词向量
- c++构造函数的调用顺序
- CORS 跨域 实现思路及相关解决方案
- Json转换利器Gson之实例三-Map处理(上)--(LinkedHashMap)--(手动解析-TypeToken)
- Get the Containers
- Javamail配置阿里云邮箱发送邮件
- 高精度板子
- Python Queue的使用
- PullAndTab组合横排滑动上落下提
- [论文研读]非对称统计词向量(GloVe)