基类指针指向子类的对象,指针无法索引子类新成员,但是虚函数可以,为什么?
#include<iostream>
#include<string>
using namespace std;
class Animal
{
public:
string s1;
Animal():s1("in Animal"){}
virtual void sleep()
{
cout<<"Animal sleep s1="<<s1<<endl;
}
};
class fish:public Animal
{
public:
string s2;
fish():Animal(),s2("in fish"){}
void sleep()
{
cout<<"fish sleep s2="<<s2<<endl;
}
};
class bigfish:public fish{
public:
void sleep(){cout<<"bigfish sleep"<<endl;}
};
void main()
{
fish sh;
Animal *an=&sh;
//!cout<<an->s2; //这里不能索引到说s2;
an->sleep();//这里进入sleep()以后却可以打印s2;
}
我想知道在哪里记录了类的成员信息;又是如何进行类型检查的
[解决办法]
Animal类声明不包含s2,所以不能通过Animal访问它。
Animal *an=&sh;an所指对象布局下其实也有s2,可以通过string* p = (string*)((char*)an + sizeof(Animal));得到
具体知识参见侯捷XXX对象模型