人生的过程,不断学习、不断向前迈进的过程

关于类与对象的一些心得

    我们都知道虚函数为多态的实现起了关键作用,没有虚函数,多态也无从实现了。但是虚函数到时候是怎么做出来的呢,C++编译器是怎么达到动态绑定的目的的呢?

    其实C++编译器会建立一个虚函数表,每一个含有虚函数的类,编译器都会为它做出一个虚函数表,表中的每一个元素都指向一个虚函数的地址,这样在执行期就可以间接调用实际上想要绑定的函数了。此外,编译器还会为类加上一个成员变量,是一个指针,用来指向该虚函数表的(那指针常被称为vptr)。下面是一个例子:

class a{

public:

virtual void vfunc();

public:

data;

};

这样的话a对象实例在内存中占据这样的空间:

    每一个由此类派生出来的对象,都有这么一个vptr。当我们通过这个对象调用虚函数时,事实上是通过vptr找到虚函数表的,再找出虚函数的真正地址。

   虚函数表的内容是根据类中的虚函数声明次序,一一填入函数指针的。派生类会继承基类的虚函数表,当我们在派生类中改写了继承下来的虚函数时,虚函数表就受了影响:表中元素所指的函数地址将不再是基类的地址,而是派生类的地址。这样的话,指向派生类的基类类型指针调用虚函数时实际调用的是派生类所改写的虚函数了。


没有评论:

发表评论