这里设置了3个class,A,B,C之间是继承的关系,A有之间的data1和2,B继承了A,有了A的数据,然后加上自己的数据,C也是。
如果一个类里面有一个虚函数,这个对象里面就会多了一个指针,指向虚函数表。
如果父类有虚函数,子类一定有,会继承父类虚函数的调用权,这时候以B为例子,B推翻了vfunc1()重载了,留下了vfunc2().
vptr关联了vtbl(里面都是函数指针)然后关联了虚函数。
通过new c可以得到p,通过p要调用vfunc1(),因为vfunc1是虚函数,所以编译器不能通过老式的call一个地址(静态绑定),就只能通过动态绑定去寻找这个函数,如
(* (p-vptr)[n])(p);
(* p->vptr[n])(p);
n表示表的第几个。
如果想设计一个能够画出各个图形的程序,首先为了让一个容器可以容纳各个对象,每个对象的大小肯定不一样,所以不好放入容器,只能通过指针指向同类,这个指针必须是父类,因为所有的东西都是它的一种。我们通过这个指针去调用draw,各自的指针就会调用自己的虚函数去画自己。
以前我们会对各种类型使用enum来判断这是什么图形,然后通过转接表的编号判断去调用哪个函数,在C语言中如果我现在多了几个新的图形,又得重新修改代码,现在在C++中就不用了。
符合下列3个条件(动态绑定):
1、是指针
2、向上转型
3、调用的是虚函数