【发布时间】:2021-12-03 14:35:35
【问题描述】:
可以将成员添加到派生的struct,shadow 基类的同名成员,无论这是否是错误,another Q&A 解决了这个问题。我的问题是关于初始化隐藏的继承成员。 is-a 关系允许将派生的D 按值分配给基类B,但是很难初始化与基类对应的继承成员。在下面的示例中,初始化是使用 B 的大括号括起来的初始化列表完成的,但对于 D 是不可能的。我发现获得已定义 D 实例的唯一选择是默认初始化(零)并随后分配:
#include <iostream>
using namespace std;
int main()
{
struct B { int x; };
struct D: B { int x; };
B bas = {1};
cout << bas.x << endl;
D der = {};
der.x = 2;
bas = der;
cout << bas.x << endl;
der.B::x = 3;
bas = der;
cout << bas.x << endl;
static_cast<B&>(der).x = 4;
bas = der;
cout << bas.x << endl;
return 0;
}
输出:
1
0
3
4
我认为可能可行的以下想法导致了编译器错误:
D der = {1, 2};
错误:无法将 '{1, 2}' 从 '
' 转换为 'main()::D'
D der = {B::x=1, 2};
错误:非静态数据成员'main()::B::x'的使用无效
错误:无法将 '{
, 2}' 从 ' ' 转换为 'main()::D'
(g++.exe -Weffc++ -pedantic -Wextra -Wall -std=gnu++11 -std=c++11 -fexceptions -g -std=c++11 使用 gcc 8.1.0)
有没有办法在 C++11 中正确初始化?
附录:
当我问这个问题时,我非常关注访问影子成员的困难,以至于我完全错过了 C++11 中 aggregate initialization 的有限选项。所以这个问题的答案也适用于没有隐藏数据成员的派生类。
【问题讨论】:
-
添加一个带有两个参数的
D构造函数?
标签: c++ c++11 inheritance initialization shadowing