今天在复习C++多态时有个问题没弄清楚,子类继承含有虚函数的父类时,子类的虚表是否是公用的?
如果是公用的,虚表什么时候创建?为了弄清楚这个问题,写了以下程序来验证
得到了如下结论:
子类的虚表是公用,虚表创建于第一个实例构造之时,所有子类实例虚表指针都指向这块虚表。
同时也验证了C++对象的内存布局
以下是验证代码:
#include "stdafx.h"
#include<iostream>
using namespace std;
class A
{
public:
virtual void a_function() {}
int a = 1;
};
class B :public A
{
public:
void a_function() {}
int b = 2;
};
class C :public A
{
public:
void c_function() {}
int c = 3;
};
int main()
{
A a1;
A a2;
B b1;
B b2;
C c1;
C c2;
cout << (int*)(&a1) << '\t' << (int *)(&a2) << '\n';//a对象虚表指针的地址,不同,存储在对象内存的起始处
cout << *(int*)(&a1) << '\t'<< *(int *)(&a2)<<'\n'; //a对象虚表指针指向的值,相同即表示同一类的不同对象虚表指针指向同一块内存
cout << *(int