要理解函数多态性和继承,关键在于理解函数的调用方式。只有虚函数才可以多态,非虚成员函数和成员变量不能。

     当通过指针或引用调用函数时,编译器将在指针或引用的静态类型的类中查找该函数,而忽略派生类。
     例如:当使用基类类型的指针或引用调用函数时,如果函数是虚函数,编译器会产生代码,在运行时根据绑定的实际类型动态的调用。 指针的可访问性是由指针的定义决定的,比如说用BaseClass定义的指针,可访问的范围就是BaseClass的内存区域。允许用一个指向基类的指针指向派生类,由于被指向的对象的内存空间大于指针的可访问空间,所以这种向上映射是安全的。基类的指针或者引用不可以访问派生类类型中新添加的成员函数和变量。如果函数不是虚函数,或者静态类型中该虚函数被隐藏(屏蔽),则调用非虚函数。
     当通过对象访问时,则在该对象的类中查找该函数,如果在该类中找不到该函数,则顺着继承链往上找。
 c++中重载/覆盖/隐藏的区别
 成员函数被重载的特征:
   (1)相同的范围(在同一个类中);
   (2)函数名字相同;
   (3)参数不同;
   (4)virtual关键字可有可无。
 覆盖是指派生类函数覆盖基类函数,特征是:
   (1)不同的范围(分别位于派生类与基类);
   (2)函数名字相同;
   (3)参数相同;
   (4)基类函数必须有virtual关键字。
 “隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
   (1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
   (2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。
 1:指针的可访问性是由指针的定义决定的,比如说用BaseClass定义的指针,可访问的范围就是BaseClass的内存区域
 2:允许用一个指向基类的指针指向派生类,由于被指向的对象的内存空间大于指针的可访问空间,所以这种向上映射是安全的
 3:对象在调用虚函数的时候,是调用父类的函数还是调用派生类的函数,是和对象的类型有关的,比如说一个派生类B,其父类是A,则B的对象调用父类中被声明为VIRTUAL的函数时,被B 所OVERRIDE的函数调用的是B里的函数,而B没有OVERRIDE的函数调用的是基类里的函数
 只有虚函数才可以多态,非虚成员函数和成员变量不能。
 只有基类指针和引用可以多态,基类对象.不可以。