例题1:
class A {
public:
A() {
m_a = 1;
m_b = 2;
}
void fun() {
printf("%d%d\n", m_a, m_b);
}
private:
int m_a;
int m_b;
};
class B {
public:
B() {
m_c = 3;
}
void fun() {
printf("%d\n", m_c);
}
private:
int m_c;
};
int main() {
A a;
B *pb = (B*) (&a);
pb->fun();
return 0;
}
考察内存偏移, 答案 1.
编译器对 m_c 的认识就是 m_c 距离对象的偏移为 0, 于是打印了 m_a 的值
当 B 继承 A 时, 再次运行程序, 返回的是一个未定义的值, 原理还是内存偏移.
依然是访问未定义的值, 这次为什么没报错
例题2:
/*
* swap2 的问题在于没有为temp 申请空间
*/
void swap2(int *p, int *q) {
int *temp;
*temp = *p;
*p = *q;
*q = *temp;
}
/*
* p, q 只是副本
*/
void swap3(int *p, int *q) {
int *temp;
temp = p;
p = q;
q = temp;
}
// OK
void swap4(int *p, int *q) {
int temp;
temp = *p;
*p = *q;
*q = temp;
}