虚函数静态绑定与动态绑定
- 当类里面定义虚函数,在编译阶段,会创建一个虚函数表,通过虚函数表指针进行指向。虚函数表内分别存储了,&RTTI信息,偏移量(一般为0),定义的虚函数地址
- 同一个类定义的不同对象的虚函数指针指向同一个虚函数表
- 当派生类继承某一个定义虚函数的基类时,同时也会创建一个定义虚函数表的虚函数指针。当派生类重写了某个虚函数,那么虚函数表里面的函数地址会进行更新成自定义的函数地址。
#include <iostream>
using namespace std;
class Base {
public:
Base(int data) : ma_(data) {
}
virtual void show() {
cout << "Base::show()" << endl; }
void show(int) {
cout << "Base::show(int)" << endl; }
protected:
int ma_;
};
class Drived : public Base {
public:
Drived(int data):Base(data), mb_(data){
}
void show() {
cout << "Drived::show()" << endl; }
private:
int mb_;
};
int main()
{
Drived d(10);
Base* p = &d;
}
编译器发现,void show()为普通函数就进行静态绑定,要是为虚函数就进行动态绑定。要是Base里面没有虚函数,那么*p就是Base就是识别为Base类型;要是Base里面有虚函数,那么就通过虚函数指针里面的&RTTI信息进行识别Drived