我正在研究如何在C++中将成员的内存偏移量转换为类,并在维基百科上看到了这一点:
在C++代码中,您不能使用offsetof来访问非Plain Data Data Structures的结构或类的成员.
我尝试了它似乎工作正常.
class Foo
{
private:
int z;
int func() {cout << "this is just filler" << endl; return 0;}
public:
int x;
int y;
Foo* f;
bool returnTrue() { return false; }
};
int main()
{
cout << offsetof(Foo, x) << " " << offsetof(Foo, y) << " " << offsetof(Foo, f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到了一些警告,但它已经编译,运行时它给出了合理的输出:
Laptop:test alex$ ./test
4 8 12
Run Code Online (Sandbox Code Playgroud)
我想我要么误解POD数据结构是什么,要么我错过了其他一些难题.我不知道问题是什么.
我从这个条目中看到虚拟继承将sizeof(指针)添加到对象的内存占用.除此之外,默认情况下使用虚拟继承是否有任何缺点,只有在需要时才使用常规继承?这似乎会带来更具前瞻性的课堂设计,但也许我错过了一些陷阱.
虚拟基类是一种防止使用多重继承时给定类的多个实例出现在继承层次结构中的方法。然后针对以下课程
class level0 {
int a;
public :
level0();
};
class level10:virtual public level0 {
int b;
public :
level10();
};
class level11 :virtual public level0 {
int c;
public :
level11();
};
class level2 :public level10,public level11 {
int d;
public:
level2();
};
Run Code Online (Sandbox Code Playgroud)
我得到了以下课程的大小
等级大小0 4
10级的大小12
11级的大小12
2级的大小24
但是当我从级别10和级别11的继承中删除虚拟时,得到以下输出
等级大小0 4
等级大小10 8
等级大小11 8
2级大小
如果虚拟继承阻止了一个基类的多个实例,那么为什么在虚拟继承的情况下类的大小更大?