2009-07-28 136 views
0

我有一个类层次结构,我知道给定的类(B)总是会被派生到第二个类(D)中。在B的构造函数中,如果我确信在整个构造完成之前没有人会尝试使用它,将this指针静态转换为D *是安全的吗?在我的情况下,我想将对象的引用传递给另一个类(A)。施工期间是否向下倾斜?

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 
{}; 

此代码是否安全?

+0

这就提出了一个什么样的价值类d是增加的问题,如果B *总是*一D. ​​ – JohnMcG 2009-07-28 13:42:58

+0

B是定义一个类模板或不基于它的模板参数的成员函数。有几个这样的类模板,然后由D继承以提供依赖于模板参数的接口。 – 2009-07-29 06:54:58

回答

0

@AProgrammer's answer让我意识到static_cast可以通过将this指针从派生类传递到基类很容易避免。因此,这个问题归结为指向member-initializer-list的this指针的有效性。

我发现下面的注释在C++标准[12.6.2.7]:

[注:因为MEM-初始化在构造的范围进行评估,所述this指针可以用在mem初始化程序表达式列表中以引用正被初始化的对象。 ]

因此,在构件-初始化列表使用this是完全有效的,所以我认为呈现的代码是安全的(只要不d的成员进行访问)。

2

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

由于D的membrs没有构造,d没有完全构造还,所以在技术上,以d参考应该是无效的。我希望在大多数实现中不成问题,但仍然如此。

我想建议一个更好的机制,但我想“更好”取决于实际的细节。

+0

我知道D还没有建成,这就是为什么我要在施工结束之前没有访问其成员的原因。 – 2009-07-28 11:51:38

2

我没有找到任何有关这方面的信息。我有麻烦找到你的代码将是不安全的原因,而这是安全的:

struct B 
{ 
    A a; 

    B(D& d) : a(d) {} 
}; 

struct D : public B 
{ 
    D() : B(*this) {} 
}; 

,但我很可能仍然使用我这里介绍的形式。