例题1:
#include <iostream>
#include <memory.h>
#include <assert.h>
using namespace std;
class A {
char k[3];
public:
virtual void aa() {
}
};
class B : public virtual A {
char j[3];
public:
virtual void bb() {
}
};
class C : public virtual B {
char i[3];
public:
virtual void cc() {
}
};
int main() {
cout << "sizeof(A)" << sizeof(A) << endl;
cout << "sizeof(B)" << sizeof(B) << endl;
cout << "sizeof(C)" << sizeof(C) << endl;
return 0;
}
这道题在 VS 下的答案是 8, 20, 32. 程序员面试宝典的答案是 8, 16, 24.
VS 的答案可根据上一篇 Post, C++ 对象内存布局分析出来.
class A. 指向虚函数表的指针, 4字节. char k[3] 对齐后 4 字节, 总共 8 字节
class B. 指向虚函数表的指针, 4字节. 指向虚基类的指针 4 字节, char [3] 对齐后 4 字节. class A 的虚函数表指针 4 字节. class A 的数据部分, 4 字节.
class C. C 的部分 12 字节, 再加上 class B 的部分, 32 字节.
例题2:
class A {
int m_na;
};
class B {
int m_nb;
};
class C : public A, public B {
int m_nc;
};
int main() {
C* pc = new C();
B* pb = dynamic_cast<B*> (pc);
A* pa = dynamic_cast<A*> (pc);
if(pc == pb)
cout << "Equal" << endl;
else
cout << "Not Equal" << endl;
if(int(pc) == int (pb))
cout << "Equal" << endl;
else
cout << "Not Equal" << endl;
return 0;
}
当执行代码 if(pc == pb) 时, 两端的数据类型不同, 比较时需要进行类型转换. 代码变成 pc == (C*) Pb 这样的话, 就 eaual 了
但 pb 实际指向的是对象 C 中子类的 B 部分, 从地址上和 pc 不一样, 所以第二个比较, 输出 not equal.
另外, 输出 pa, pb, pc 的值会发现 pa = pc, 而 pb >= pb