cplus analysis about virtual function.
This project is maintained by wangfakang
关于c++虚函数的解析:
虚函数给予了c++很强大的特性[多态],那么虚函数在对象中的内存分布又是如何的恩?是如何做多动态的多态的恩? 下面会一一解答这些问题[个人所见,如有错误,欢迎拍砖].
看看如下代码:
using namespace std;
#include<iostream>
class A {
public:
virtual void print() {
cout<<"A"<<endl;
}
private:
//int a;
};
//class B : public virtual A {
class B : public A {
public:
virtual void print() {
cout<<"B"<<endl;
}
virtual void printf() {
cout<<"Bf"<<endl;
}
private:
};
typedef void (*Pfun)();
int main()
{
A a;
B b;
Pfun fun;
int i = 0;
for(; i < 2; i++)
{
fun = (Pfun) *((int*)*(int*)(&b)+i);
fun();
}
return 0;
}
输出结果:
B
Bf
gdb调试看到如下:
(gdb) p a
$1 = {_vptr.A = 0x400c70 <vtable for A+16>}
(gdb) p b
$2 = warning: can't find linker symbol for virtual table for `B' value
warning: found `B::B()' instead
{<A> = {_vptr.A = 0x400ba0 <__libc_csu_init>}, <No data fields>}
每个对象都有一个vptr指针---虚表指针(用来存放虚函数的地址).
注意:虚表指针位于一个对象的首的前四字节[32位系统].为啥要在放在对象首部恩? 原因很简单,便于后续的查询速度呗.
当子类D多继承与类A B C的时候,其中ABC中都有虚函数:
在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流