C++中的虚函数表,并不属于对象,属于类。比如:对象a和aa的虚函数表都是:0x4178ec。
如此可知,类的虚函数表放在跟类相关的区域,每次创建的对象,都将该对象的虚函数表的指针指向该类的虚函数表。
当子类给父类赋值时,子类的虚函数表的指针不会覆盖父类的虚函数指针,
并且,子类的虚函数表,在子类创建的时候,有编译器赋值。
测试代码如下:
#include "stdafx.h"
#include "stdio.h"
#include <iostream>
class A{
public:
int value;
virtual void print(){printf("This is A\n");}
};
class B:public A{
public:
virtual void print(){ printf("This is B\n");}
};
void a_print(A a)
{
unsigned int *p;
p = (unsigned int *)&a;
printf("%x, %x, %x, %x\n", p[0], p[1], p[2], p[3]);
a.print();
}
void b_print(B b)
{
b.print();
}
int show_array(char buffer[100])
{
char data[2][6] = {"12345", "67890"};
std::cout<<buffer[0]<<" "<<buffer[1]<<" "<<sizeof(buffer)<<" "<<strlen(buffer)<<std::endl;
std::cout<<&data<<" "<<(&data) + 1<<" "<<*((&data) + 1)<<std::endl;
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
A a;
B b;
A aa;
int c;
a.value = 0xeeeecccc;
b.value = 0xbbbbaaaa;
aa.value = 0x11112222;
a.print();
b.print();
a_print(a);
{
unsigned int *p;
p = (unsigned int *)&b;
printf("%x, %x, %x, %x\n", p[0], p[1], p[2], p[3]);
}
a_print(aa);
a_print(b);
b_print(b);
show_array("hello\n");
std::cin>>c;
std::cout<<c<<std::endl;
return 0;
}
测试结果如下: