/*******************************************************************************
* 赋值兼容规则是指在需要基类对象的任何地方都可以使用共有派生类的对象来替代。
* 通过公有继承,派生类得到了出了构造、析构函数以外的所有成员且这些成员的访问控制
* 属性也和基类完全相同。这样,它便具备了基类的所有功能。
* 赋值兼容规则中所指的替代包括以下的情况:
* a 派生类的对象可以赋给基类对象
* b 派生类的对象可以初始化基类的引用
* c 派生类的对象的地址可以赋给基类类型的指针
*
*-------------------------------------code-----------------------------------
* class B{...};
* class D:public B{...}
* B b1, *pb1;
* D d1;
* b1 = d1;//派生类的对象赋给基类对象
* B &bb = d1;//派生类的对象初始化基类的引用
* pb1 = &d1; //派生类的对象的地址赋给基类类型的指针
*----------------------------------end code---------------------------------
*
* 替代以后,派生类的对象就可以作为基类的对象使用,但只能使用从基类继承的成员。
*******************************************************************************/
#include
class B0
{
public:
void display(){printf("in bo\n");}
};
class B1:public B0
{
public:
void display(){printf("in b1\n");}
};
void fun(B0 *ptr)
{
ptr->display();
}
int main()
{
B0 b0, *p;
B1 b1;
p = &b0;
fun(p);
p = &b1;
fun(p);
return 0;
}
/**************************result*******************************
* 程序运行结果:
* in bo
* in bo
*
*************************end result*****************************/
/****************************analysis*******************************
* 分析:
* 程序中,分别将基类对象、派生类的对象赋值给了基类类型的指针p
* 但是通过指针p只能使用继承下来的基类成员。
* 也就是说尽管指针指向派生类的对象,fun函数运行时通过这个指针只能访问B1
* 从B0继承过来的成员函数display();而不是B1自己的同名成员函数.
*
* 所以通过赋值兼容规则,我们可以在基类处向的场合使用派生类进行替代,但是
* 替代之后派生类仅仅发挥出基类的作用,所以需要用到面向对象的另外一个重要
* 特征--多态性,以保证在赋值兼容的前提下,基类和派生类以不同的方式来响应
* 相同的消息。
******************************end analysis*********************/
//to be continue
阅读(2145) | 评论(0) | 转发(0) |