- 论坛徽章:
- 0
|
- #include <iostream>
- using namespace std;
- class A {
- public:
- virtual void f() const
- { cout << "class A" << endl; }
- };
- class B : public A {
- public:
- void f() const
- { cout << "class B" << endl; }
- };
- class C : public B {
-
- public:
- int i;
-
- void f() const
- { cout << "class C" << endl; }
- void g(int v) {
- i = v;
- cout << i << endl;
-
- cout << "&i=" << &i << endl;
- }
- };
- A * arr[2] = { new B, new C };
- int main()
- {
- cout << "sizeof(B)=" << sizeof(B) << ", sizeof(C)=" << sizeof(C) << endl;
-
- cout << "arr[0]=" << arr[0] << ", arr[1]=" << arr[1] << endl;
- (static_cast<C*>(arr[0]))->g(99);
-
- arr[0]->f();
- }
复制代码
运行的结果是:
sizeof(B)=4, sizeof(C)=8
arr[0]=0x3d2448, arr[1]=0x3d24b0
99
&i=0x3d244c
class B
arr[0]指向对象的大小是4,arr[0]的起始地址是0x3d2448,而调用 (static_cast<C*>(arr[0]))->g(99) 往变量i赋值,i的地址是 0x3d244c,已经超出了 arr[0]对象的范围。所以这个调用 (static_cast<C*>(arr[0]))->g(99) 是绝对错误的。
那为什么运行没有出错呢?因为 &arr[0]=0x3d2448, &arr[1]=0x3d24b0,在arr[1]和arr[0]之间有一段空白的内存,这段内存虽然没有经过分配,但是却是可读写的。所以虽然(static_cast<C*>(arr[0]))->g(99)写到了错误的地方,却幸运的没有引起异常................. |
|