c++ - 为什么基类的成员不保留它在构造函数中首次初始化的值?
问题描述
#include <iostream>
using namespace std;
class B {
protected:
int x;
public:
B() {
x = 78;
}
};
class D1 : virtual public B {
public:
D1() {
x = 15;
}
};
class D2 : virtual public B {
public:
D2() {
x = 37;
}
};
class C : public D2, public D1 {
public:
int get_x() {
return x;
}
};
int main()
{
C ob;
cout << ob.get_x();
return 0;
}
创建 C 对象时,x 的值是 15 而不是 78。我想知道是不是因为最后调用的构造函数(更改了 x 的值)是 D1 构造函数?
解决方案
我想知道是否是因为最后调用的构造函数(更改了 x 的值)是 D1 构造函数?
是的,这正是发生的事情。类的基本构造函数按照列出祖先的顺序调用。由于D1
最后列出,它的构造函数最后被调用。B'
首先调用 s 的构造函数初始化x
为 78,然后用 37D2
覆盖 s 的构造函数,然后用 15覆盖 s 的构造函数。x
D1
x
推荐阅读
- flutter - 如何将身份证件删除
- python - 根据多个条件从元组列表中删除项目
- android - 当我运行 flutter pub get 时出现此错误“date_picker_timeline”取决于 intl ^0.16.0 而“flutter_localizations”取决于 intl 0.17.0
- javascript - 多次输出 Div ID
- python - 从 3D 散点图中获取多个圆柱体
- python - 使用python创建一个xml文件
- java - 为什么 Java Unix 时间和日历计算准确时间?
- mysql - Docker 镜像在 m1 处理器中运行
- flutter - 在 null 上调用了方法“*” - Flutter
- java - 将 Instant 转换为 LocalDateTime 时的不同值