指向类的指针我们不妨理解为是一个大接口,这个大接口上又有很多小接口分别对应不同的成员变量或者成员函数,可以形象把大接口理解成游戏机的外壳,小接口就是上面的按钮。
定义指向不同类的指针就是定义不同的大接口,即不同的游戏机。
而将指针指向类时就是给这个大接口接上内存(对象),即给这个游戏机安装上内部硬件。
对于基类与派生类,不妨认为B硬件就是A硬件加了一些硬件后所形成的。
而虚函数,就是一个动态变化的小接口,不妨认为是一个可以根据硬件不同而自动更换硬件的按钮。
class A
{
public:
virtual int x();
int y();
......
};
class B:protected A
{
public:
virtual int x();
int y();
......
};
main0
{
A aobjt;//定义的是A这种类型的内存(硬件)
B bobjt;//定义的是B这种类型的内存(硬件)
A*p_a;//定义的是A这种类型的接口,即A游戏机外壳
B*p_b;//定义的是B这种类型的接口,即B游戏机外壳
p_a=&bobjt;//将A接口接到B内存上,A类指针只能读取B类对象中的A类数据,即用A游戏机的外壳可以正常使用B硬件上的A的硬件,那么这个游戏机自然可以正常运行起来,注意的是B硬件新增的部分显然A外壳上没有对应的按键,所以无法使用这些新增部分。
p_b=&aobjt;//将B接口接到A内存上,B类指针只能能读取A类对象中的数据,那么自然是这个程序可能会出错,一个游戏机,好几个按键用不了了,这个游戏就不一定能玩下去了。如果没有新增小接口,即新增按钮,那就不会报错。
p_a->y();//这里调用的其实是B类继承过来的A中的y()函数,而不是B自己重新定义的y()函数,毕竟用的接口是A的,按钮是A的。
p_b->y();//这里调用的是B类自己重新定义的y()函数(但是数据还是A类中的数据),而不是A类的y()函数。
p_a->x();//这里要注意了,调用的是B类自己重新定义的x()函数,因为是虚函数,就和前面说的一样,这个按钮是可以自动变化的,它自动变成了B的对应按钮。
p_-b>x();//这里同理,调用的是A类中自己的x()函数。
......
}
大概就是这样了,目前可能有些混乱或者错误,待我有时间了来整理下。
补充:单纯指针的赋值,只是传递相同数据的首地址,也就是说只要有相同数据就可以对指针进行赋值,是不会报错的,报错的是后面不小心用到了超出地址的部分