(1) vtable的影响
导致一个对象实例增大4个字节
#include <cstdlib>
#include <iostream>
using namespace std;
class A
{
int a;
};
class B
{
virtual void say()
{
}
int b;
};
int main(int argc, char *argv[])
{
A a;
B b;
cout<<"A a : "<<sizeof(a)<<endl;
cout<<"B b : "<<sizeof(b)<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
对含有虚表的对象实例不能采用memset操作
虚表的生成时间,生成地点的影响,生成的地点受placement new影响
#include <cstdlib>
#include <iostream>
using namespace std;
class A
{
public:
A()
{
Show();
}
virtual void Show()
{
cout<<"A"<<endl;
}
};
class B : public A
{
public:
B()
{
Show();
}
void Show()
{
cout<<"B"<<endl;
}
};
int main(int argc, char *argv[])
{
B b;
system("PAUSE");
return EXIT_SUCCESS;
}
(2)用C语言模拟vtable
#include <cstdlib>
#include <iostream>
using namespace std;
void func1(int a)
{
cout<<"func1"<<endl;
}
void func2(int b)
{
cout<<"func2"<<endl;
}
struct vtable
{
void (*func)(int v);
};
struct A
{
struct vtable table;
void Show(int v)
{
table.func(v);
}
};
int main(int argc, char *argv[])
{
A a, b;
a.table.func = func1;
b.table.func = func2;
a.Show(1);
b.Show(1);
system("PAUSE");
return EXIT_SUCCESS;
}