在派生初始化列表中获取父地址

时间:2013-06-09 11:46:03

标签: c++ multiple-inheritance initialization-list

是否有一种标准安全的方法来获取子构造函数初始化列表中其中一个基类的地址?

这是我想要做的:

我有一个多个类,它们提供一些处理缓冲区的功能(void *,length),我有多个类来保存数据(c风格的结构)。我想用最少的代码为用户提供两者。以下是我的想法:

//Parent1 is POD (old c-style structure)
struct Parent1{/*C style stuff*/};

//Parent2 and Parent3 are NOT POD (virtual functions, copy constructors, ...)
class Parent2{public: Parent2(void*, size_t);/*stuff*/};
class Parent3{public: Parent3(void*, size_t);/*stuff*/};

/*order of inhertiance is not guranteed, it could be Parent2, Parent2, Parent3*/
struct Child1 : public Parent1, public Parent2, public Parent3
{
    Child1()
        : Parent2((Parent1*)this, sizeof(Parent1)),
        Parent3((Parent1*)this, sizeof(Parent1))
    {
    }

    //using self() instead of this is trick which I don't prefer to use.
    const Child1* self()const{return this;}
};

这可以很好地编译gcc,但会在visual studio上发出警告,我稍后会尝试其他嵌入式编译器。我正在寻找可以通过MISRA C++ checkspolyspace支票和any other static analysis tool的标准解决方案。

修改

Visual Studio警告:警告C4355:'this':用于基本成员初始化列表

1 个答案:

答案 0 :(得分:0)

在ctor列表中,通常的转换有效,因此Derived *会隐式转换为Base *。没有任何工作。 (如果被调用的函数或ctor需要这种转换;对于void *,你得到一个reinterpret_cast等价物。)

但是你必须意识到终身问题。在施工期间,该类是半中,因此使用此或其任何转换形式可能会导致使用稍后将初始化的部分。这就是你收到警告的原因。对于您的情况,它可能适用也可能不适用。

我通常不允许任何东西,但存储从this传递的指针,实际使用将在稍后出现。

不要使用c风格的演员代替static_cast!并且你的虚空气味很糟糕,考虑使用键入的指针并废弃所有强制转换,只留下隐式转换。 特别是因为没有设施可以恢复丢失的类型信息。