对继承基类的成员使用指定初始化程序

Nox*_*Nox 5 c++ parameters named

Something我创建了一个包含成员变量的类。

我能够做到这一点,它按预期工作:

struct Something
{
    bool Works;
};

int main()
{
    Something s = {
        .Works = false,
    };
}
Run Code Online (Sandbox Code Playgroud)

现在,我想创建一个继承自Something、named的结构Something2,并想做同样的事情,但我希望能够访问Something::Works(我将其重命名为DoesntWork,因为它不起作用!):

struct Something
{
    bool DoesntWork;
};

struct Something2 : public Something
{
    bool Works;
};


int main()
{
    Something2 s2 = {
        .Works = true,
        .DoesntWork = false,
    };
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/rYT3br467

我不是在寻找替代方案,我已经想到了一些。我只是想知道这是否可能,如果可以,那么如何实现。

如果不可能,我真的很想知道低级原因,所以不要犹豫!

更新:感谢 Nathan Oliver 的评论,您可以阅读:Designatedinitializer in C++20

Ted*_*gmo 4

C++在指定初始值设定项方面比 C 严格得多。

cpp参考

C 编程语言支持乱序指定初始化、嵌套指定初始化指定初始化器和常规初始化器的混合以及数组的指定初始化,但在 C++ 中不允许

C 根本没有继承概念,这使得 C 版本的指定(至少在 C++20 之前)不可能。未来一种可能的版本是将其指定为“向前”,就像在具有委托构造函数的构造函数中经常所做的那样。在这种情况下,我希望正确的初始化是这样的:

Something2 s2 = {
    Something = {
        .Works = false
    },
    .DoesntWorks = true
};
Run Code Online (Sandbox Code Playgroud)

然而,从 C++20 开始,这不是 C++ 的一部分。但是,您可以在 C++ 中创建构造函数来满足(部分)您的需求,而无需指定初始值设定项:

struct Something {
    bool DoesntWork;
};

struct Something2 : public Something {
    Something2(bool Doesnt, bool Does) : 
        Something{Doesnt}, 
        Works{Does} 
    {}
    bool Works;
};

int main() {
    Something2 s2
    {
        true, false
    }; 
}
Run Code Online (Sandbox Code Playgroud)

或者根本不需要用户定义的构造函数来初始化每个对象:

struct Something {
    bool DoesntWork;
};

struct Something2 : public Something {
    bool Works;
};

int main() {
    Something2 s2{
        // You could just make it `{true}` below, but mentioning the
        // subobject fits the purpose of a designated initializer for clarity:
        Something{true},
        // this must however be left unmentioned in C++20 since you can't
        // mix regular initializers with designated ones:
        false
    };
}
Run Code Online (Sandbox Code Playgroud)