【问题标题】:Inheritance constructor safety in C++C++ 中的继承构造函数安全
【发布时间】:2014-02-01 17:11:13
【问题描述】:

我有这个层次结构:

struct Params { int k = 17; };
struct A
{
    A(Params& par): _p(par)
    { }

    Params& _p;
};

struct B: public A
{
    using A::A;
    int c{this->_p.k};
};

int main()
{
    Params p;
    B b(p);
    return 0;
}

我可以放心A::_pB::c 的声明中调用它之前总是会被初始化吗?

谢谢!

【问题讨论】:

  • 是的,A::_p 来自于基类,所以必须在派生类开始构建之前对其进行初始化。
  • 谢谢!你应该把这个作为答案!

标签: inheritance c++11 constructor default-constructor


【解决方案1】:

是的,它将被初始化。

在开始构造派生类之前,必须完全构造基类。因此只要来自A 的构造函数初始化A::_p,派生类将始终*看到它完全初始化。

[*] 当然,只要付出足够的努力,你总能打破一切;例如:http://coliru.stacked-crooked.com/a/196a5b0217efbbb1 在那里,我使用逗号运算符调用B::foo(),然后才能构造任何东西;幸运的是,编译器将其检测为警告。

【讨论】:

    猜你喜欢
    • 2017-08-09
    • 1970-01-01
    • 2019-01-21
    • 2015-06-09
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 2012-11-14
    相关资源
    最近更新 更多