在多个inhertance中调用构造函数initilizer列表中的sizeof

时间:2018-03-22 17:14:12

标签: c++

这里我们在派生类WData1上调用sizeof运算符。据我所知,将调用第一个基类构造函数(Persistent)。直到现在WData1还不存在,因为正在调用类Persistent构造函数并且类Data正在等待轮到他。

*

class WData1 : public Persistent, public Data {  
public:  
WData1(float f0 = 0.0, float f1 = 0.0,
float f2 = 0.0) : Data(f0, f1, f2),
Persistent(sizeof(WData1)) {}};

*

我的问题是sizeof在派生类上的表现如何还不存在?

2 个答案:

答案 0 :(得分:1)

  

我的问题是sizeof在派生类上的表现如何,并非如此   还存在吗?

该类已存在,因此sizeof没有任何问题。 sizeof是一个编译时构造,在您编译时它所需的所有信息都已经存在。

确实Persistent构造函数在WData1构造函数之前被调用,但这并不重要,因为已知WData1的类型信息。构造函数调用是一个运行时构造,sizeof不是

答案 1 :(得分:0)

  

我的问题是sizeof将如何在派生类上表现但尚不存在?

sizeof(WData1)是类WData1的大小(包括父基PersistentData)。

即使您创建

struct Derived : WData1
{
    char BigBuffer[1024 * 42];
};

sizeof(WData1)无法改变。

您可能想要使用sizeof(*this)

class WData1 : public Persistent, public Data {  
public:  
    WData1(float f0 = 0.0, float f1 = 0.0, float f2 = 0.0)
        : Data(f0, f1, f2),
          Persistent(sizeof(*this))
    {}
};

但是sizeof是编译时间,并且会使用静态类型WData1

您必须将派生类的大小传播到父级:

class WData1 : public Persistent, public Data {  
public:  
    WData1(float f0 = 0.0f,
           float f1 = 0.0f,
           float f2 = 0.0f,
           std::size_t size = size_of(WData1))
        : Data(f0, f1, f2),
          Persistent(size)
    {}
};

struct Derived : WData1
{
    Derived(std::size_t size = size_of(Derived)) : WData1(0.f, 0.f, 0.f, size) {}
    char BigBuffer[1024 * 42];
};