C++13、抽象类和虚表

示例:



运行结果如下:


从结果我们可以看出了,PIX和PIY 只差了4个字节,原因呢?当然那是一个指针的距离,一个虚表指针的距离!

那什么是虚表呢?

答案如下:

C++中每个有虚函数的类或者虚继承的子类,编译器都会为它生成一个虚拟函数表(简称:虚表),表中的每一个元素都指向一个虚函数的地址。(注意:虚表是从属于类的)此外,编译器会为包含虚函数的类加上一个成员变量,是一个指向该虚函数表的指针(常被称为vptr),每一个由此类别派生出来的类,都有这么一个vptr。虚表指针是从属于对象的。
也就是说,如果一个类含有虚表,则该类的所有对象都会含有一个虚表指针,并且该虚表指针指向同一个虚表。虚表的内容是依据类中的虚函数声明次序--填入函数指针。派生类别会继承基础类别的虚表(以及所有其他可以继承的成员),当我们在派生类中改写虚函数时,虚表就受了影响;表中的元素所指的函数地址将不再是基类的函数地址,而是派生类的函数地址。

具体示例如下(下面程序代码示例源自  

http://coolshell.cn/articles/12165.html




你可能感兴趣的:(C++,抽象类,虚表)