基类对象可以定义一个指针指向派生类,但是派生类不可以定义指针指向基类。
因为:基类如果定义的指针,指针中存放的数据都是基类中存在的,而派生类继承了这些subobject;但是如果派生类定义指针,这个指针所指向的对象不仅仅有基类的subobject,还有自己的一部分定义的数据,用这个指针去访问基类就可能会访问到一些根本不存在的成员。引用也是同理!
subobject就是基类中有的成员,派生类继承的部分。
class concrete1 {
public:
int val;
char bit1;
};
class concrete2 :public concrete1 {
public:
char bit2;
};
void main() {
concrete1 base ;
concrete2 derived ;
concrete1 *base_ptr = &derived; //正确:允许定义基类指针指向派生类
concrete2 *derived = &base; //错误:派生类不能指向基类
}