簡體   English   中英

在 C++11 中使用(陰影)基類數據成員初始化結構

[英]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 中聚合初始化的有限選項。 所以這個問題的答案也適用於沒有隱藏數據成員的派生類。

D der = {1, 2}將在 C++17 中工作,如

D der = {{42}, 2};

演示

對於以前的版本,您不能像這樣初始化 base 並且需要一個構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM