实例
继承中支持的是从下到上的转换。
比如有个基类叫职业类, class Occupation;
class Occupation
{
public:
Occupation();
virtual ~Occupation();
};
然后可以派生出学生类,老师类,程序员类等, 如class Student;
class Student : public Occupation
{
public:
Student();
~Student();
};
我们可以将派生类对象赋值给一个基类对象,换言之,学生类赋值给职业类。没什么问题,学生本身就是职业的一种。
但是,不能将基类赋值给派生类,因为职业可能有很多种,不能随便找来一个人就说他说学生,这样是不合适的。
int main
{
Occupation occupation;
Student student;
// OK
occupation = student;
//ERROR
student = occupation;
return 0;
}
再来看指针或者引用(此时还没有引入多态的概念):
int main
{
Occupation occupation;
Student student;
// OK
Occupation * op = &student;
// ERROR
Student *sp = &occupation;
return 0;
}
基类指针可以指向派生类对象,但是此时他的"管辖能力" 或者可访问的范围 是派生类对象中基类部分,即上图黑色的部分,此时对于基类指针来讲,他是不能访问派生类对象中红色特有的部分,无论怎么访问,都不会出现内存越界等问题,所以是合理的。
派生类不能指向基类,因为往往派生类类型占用空间大,所以派生类指针的可访问范围也比较大,途中绿色的部分实际上对于基类对象occupation来讲,他是没有绿色这部分内存的,但是指针sp有可能去访问绿色这部分空间,因为sp可访问范围就是黑色加上绿色的部分,如果sp去访问这部分空间,那么将出现不可预料的事情,所以编译器是不允许我们这样转换的。
总结:
本文不讨论虚函数到多态的产生,只讨论继承结构基类派生类相互转换相互引用的问题。