例题1:
class A { public: A() { m_a = 1; m_b = 2; } void fun() { printf("%d%d ", m_a, m_b); } private: int m_a; int m_b; }; class B { public: B() { m_c = 3; } void fun() { printf("%d ", 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; }