虚函数与多态

来源:互联网 发布:网络编程socket 编辑:程序博客网 时间:2024/06/05 07:01

重载与多态

对于函数重载,在静态绑定的,对于函数的调用在编译器期间已经确定,同名函数可能被编译器修饰成不同的名称如int_func,str_func。

C++对象的内存布局

派生对象创建时,对象隐形的this指针会覆盖到基类的范围,所以派生类成员能够对基类成员操作。派生类的this指针指向基类的开始地址。构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是this指针,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。类似于Python类中每个成员函数的第一个参数总是显式的self。子类按声明顺序调用父类的构造函数单继承:单继承的对象的布局,第一个为虚函数表指针vtbl,其后为成员且先基类后子类,虚函数表里包含了所有的虚函数的地址,以NULL结束。虚函数如果子类有重写,就由子类的重新的代替。多继承:与单继承相同的是所有的虚函数都包含在虚函数表中,所不同的多重继承有多个虚函数表,当子类对父类的虚函数有重写时,子类的函数覆盖父类的函数在对应的虚函数位置,当子类有新的虚函数时,这些虚函数被加在第一个虚函数表的后面虚继承:虚继承,使公共的基类在子类中只有一份,我们看到虚继承在多重继承的基础上多了vbtable来存储到公共基类的偏移

虚函数机制,多态的实现

典型的编译器会为每个包含虚函数的类(的对象)创建一个表(称为VTable),在VTable中,编译器放置特定类的虚函数指针。在每个带有虚函数的类中,编译器秘密的放置一个指针,称为vpointer,指向这个对象的VTable。当通过基类指针做虚函数调用时,编译器静态的插入vpointer并在VTable中查找函数地址的代码,引起动态绑定。
0 0