#include
using namespace System;
using namespace std;
class Base
{
public:
Base() :data(count)
{
cout << "Base-ctor" << endl;
++count;
}
~Base()
{
cout << "Base-dtor" << endl;
--count;
}
static int count;
int data;
};
int Base::count;
class Derived : public Base
{
public:
Derived() :data(count), data1(data)
{
cout << "Derived-ctor" << endl;
++count;
}
~Derived()
{
cout << "Derived-dtor" << endl;
--count;
}
static int count;
int data1;
int data;
};
int Derived::count = 10;
int main()
{
cout << sizeof(Base) << endl;
cout << sizeof(Derived) << endl;
Base* pb = new Derived[3];
cout << pb[3].data<< endl;
cout << ((static_cast<Derived*>(pb)) + 0)->data1 << endl;
delete[] pb;
cout << Base::count << endl;
cout << Derived::count << endl;
Console::Read();
return 0;
}
这里的pb到底指向哪里,pb3的值为什么是10
VS2010 X86环境中Sizeof(Base)为4,Sizeof(Derived)为12。因为pb[3]即*(pb + 3)且pb为Base类型指针,所以偏移12字节。
偏移后,pb实际上是指向第2个Derived了,因为你写的Base和Derived的大小刚好是3倍关系。所以pb[3].data输出的是第2个Derived的基类的data。这段代码里有太多巧合,画个图给你看下吧。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。