[英]Initialize struct with (shadowed) base-class data members in C++11
這是可能的成員添加到衍生struct
,所述基類的影子同名成員,這是否是錯誤或不被尋址的另一個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”的無效使用
錯誤:無法將 '{<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
with gcc 8.1.0)
有沒有辦法在 C++11 中正確初始化?
附錄:
當我問這個問題時,我非常關注訪問影子成員的困難,以至於我完全錯過了 C++11 中聚合初始化的有限選項。 所以這個問題的答案也適用於沒有隱藏數據成員的派生類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.