代码之家  ›  专栏  ›  技术社区  ›  Luc Touraille

在施工期间向下浇灌是否安全?

  •  0
  • Luc Touraille  · 技术社区  · 16 年前

    我有一个类层次结构,我知道一个给定的类(B)将总是派生到第二个类(D)。在B的构造函数中,静态地强制转换 this

    struct A
    {
        D & d_;
    
        A(D & d) : d_(d) {}
    };
    
    struct D; //forward declaration
    
    struct B
    {
        A a;
    
        B() : a(std::static_cast<D&>(*this)) {}
    };
    
    struct D : public B
    {};
    

    这个密码安全吗?

    3 回复  |  直到 16 年前
        1
  •  2
  •   AProgrammer    16 年前

    我没有发现任何关于那个的东西。我很难找到您的代码在安全的情况下不安全的原因:

    struct B
    {
        A a;
    
        B(D& d) : a(d) {}
    };
    
    struct D : public B
    {
        D() : B(*this) {}
    };
    

    但我可能仍然会使用我现在的表格。

        2
  •  2
  •   peterchen    16 年前

    不,不是。D的数据成员的构造函数尚未运行。

    我想提出一个更好的机制,但我想“更好”在很大程度上取决于实际的细节。

        3
  •  0
  •   Community Mohan Dere    9 年前

    @AProgrammer's answer static_cast 可以通过传递 this 从派生类指向基类的指针。因此,问题归根结底是该协议的有效性 指向成员初始值设定项列表的指针。

    [ 注: 因为 在构造函数的范围内进行评估 指针可用于 表达式列表 属于 引用正在初始化的对象。]

    因此,使用