A a;
B b;//B类是A类的子类
a=b;//B的内容被A类对象进行裁剪,a仍然属于A类
a.func();//调用的是A的函数
必须用引用和指针,上述因为是在编译时就确定好了,所以调用的仍然是父类.
A &a=b;
a.func();//这样可以
对多态的支持
1、类型的隐含转化
circle作为shap的子类
shap *ps=new circle();
2、经由虚函数机制
ps->rotate();
3、dnnamic和typeid
if (circle *pc=dynamic_cast(ps))
多态接口的定义
通常定义在一个抽象的基类中的接口由虚函数支持。
可以程序执行期决定哪个类执行。
比如
func(
A a, const A *a1,const A&a2
)
{
a.func();//这句因是编译期决定的,所以永远是调用A类的函数,下面2句在下述程序中是调用B类的
(*a1).func();
(*a2.func);
}
main()
{B b;//B是A的子类
func(b,&b,b)
}
如此说来类对象要多少空间来表示呢
1、非静态数据成员的空间
2、为支持VIRTUAL而产生的如虚函数表及其指针等所需要的空间
3、由于成员存放的边界需要而产生的边界空间。
4、指针无论指向什么类型,其空间大小都是一样的,只是类型不同,其指向的地址所代表内容的长度不同而已
指向对象的指针
B b;//b是a的子类,且B比A多定义几个非静态成员
A*a=&b;//指针指向的空间仅包括A类对象的空间大小,不包括B类的几个非静态成员所在的空间,尽管
//已经指向了B类的空间,不能使用a来操作B类对象所特有的东东
B *bb=&b;//包括B类对象所占用的空间。
//以下方法可以使用B类对象的空间
((B*)a)->x;//x是B类的int型的数据成员