這是可能的成員添加到衍生struct
該陰影的基類的同名成員,這是否是錯誤或不被尋址的另一個Q&A。我的問題是關于初始化隱藏的繼承成員。is-a 關系允許派生D
到基類的按值賦值B
,但是很難初始化對應于基類的繼承成員。在下面的例子中,初始化是用括號括起來的初始化串列 for 完成的,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”的無效使用
錯誤:無法將 '{<expression error>, 2}' 從 '<brace-enclosed initializer list>' 轉換為 '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 中聚合初始化的有限選項。所以這個問題的答案也適用于沒有隱藏資料成員的派生類。
uj5u.com熱心網友回復:
D der = {1, 2}
將在 C 17 中作業,如
D der = {{42}, 2};
演示
對于以前的版本,您不能像這樣初始化 base 并且需要一個建構式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/317129.html
上一篇:C 中的名稱和變數有什??么區別