天天看点

虚函数以及静态绑定与动态绑定简单总结

一个类添加了虚函数,对这个类有什么影响?

一个类里面定义了虚函数,那么编译阶段,编译器会给这个类类型产生一个唯一的虚函数表(vftable),虚函数表里面储存的内容主要是RTTI指针和虚函数的地址。当程序运行时,每张虚函数表都会加载到内存的.rodata区。

一个类里定义了虚函数,那么这个类定义的对象,其运行时,内存中开始的部分会多储存一个vfptr虚函数指针,指向对应类型的虚函数表。一个类型定义的n个对象,vfptr指向的都是同一张虚函数表。

一个类中定义多个虚函数,不会影响对象内存的大小,只会影响虚函数表的大小。

如果派生类的方法和基类继承来的某个方法,返回值、函数名、参数列表都相同,而且基类的方法是虚函数,那么派生类中的这个方法自动处理成虚函数。

静态绑定与动态绑定的区别?

静态绑定是编译时期的绑定,绑定的是普通函数的调用;动态绑定是运行时期的绑定,绑定的是对虚函数的调用

**重载:**一组函数要重载,必须处在同一作用域下,而且名字相同,参数列表不同。

**隐藏:**在继承结构中,派生类的同名成员,把基类的同名成员给隐藏了。

**覆盖:**基类和派生类的方法,返回值、函数名、参数列表都相同,而且基类的方法是虚函数,那么派生类的方法就自动处理成虚函数,他们之间成为覆盖关系。

哪些函数不能处理成虚函数?

虚函数依赖:

1.虚函数能产生地址,储存在vftable中。

2.对象必须存在(vfptr->vatable->虚函数地址)

派生类对象的构造过程:

1.先调用的是基类的构造函数

2.再调用派生类的构造函数

什么时候 把基类的析构函数必须实现成虚函数?

基类的指针(引用)指向堆上new出来的派生类对象的时候

它在调用析构函数的时候,必须发生动态绑定,否则会导致派生类的析构函数无法调用

是不是虚函数一定是动态绑定?

不是,在类的构造函数中,调用虚函数,是静态绑定,不会发生动态绑定,用对象本身调用虚函数,也是静态绑定。必须由指针或者引用调用虚函数,才会发生动态绑定。