这里我们在派生类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在派生类上的表现如何还不存在?
答案 0 :(得分:1)
我的问题是sizeof在派生类上的表现如何,并非如此 还存在吗?
该类已存在,因此sizeof
没有任何问题。 sizeof
是一个编译时构造,在您编译时它所需的所有信息都已经存在。
确实Persistent
构造函数在WData1
构造函数之前被调用,但这并不重要,因为已知WData1
的类型信息。构造函数调用是一个运行时构造,sizeof
不是
答案 1 :(得分:0)
我的问题是sizeof将如何在派生类上表现但尚不存在?
sizeof(WData1)
是类WData1
的大小(包括父基Persistent
和Data
)。
即使您创建
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];
};