*虚函数表:虚函数表是通过一块连续的内存来存储虚函数的地址
下面是一段程序
class A
{
public:
virtual void fun1()
{}
virtual void fun2()
{}
private:
int a;
};
void test()
{
A s;
}
int main()
{
test();
system("pause");
return 0;
}
虚函数表:
探究单继承对象模型
class A
{
public:
virtual void fun1()
{
cout << "A::fun1()" << endl;
}
virtual void fun2()
{
cout << "A::fun2()" << endl;
}
private:
int a;
};
class B :public A
{
public:
virtual void fun1()
{
cout << "B::fun1()" << endl;
}
virtual void fun3()
{
cout << "B::fun3()" << endl;
}
virtual void fun4()
{
cout << "B::fun4()" << endl;
}
private:
int b;
};
void test()
{
A aa;
B bb;
}
int main()
{
test();
system("pause");
return 0;
}
上图中子类B::fun1重写了父类A::fun1,覆盖了相应虚表位置上的函数。这里并没有看到子类中的fun3和fun4,实际上这两个函数就存放在fun2的后面,只是 编译器没有显示,这是编译器的一个bug(所采用的编译器为vs2013)
*多继承(菱形继承)的内存布局
#include<iostream>
using namespace std;
class A
{
public:
virtual void fun1()
{
cout << "A::fun1()" << endl;
}
virtual void fun2()
{
cout << "A::fun2()" << endl;
}
private:
int a;
};
class B
{
public:
virtual void fun1()
{
cout << "B::fun1()" << endl;
}
virtual void fun2()
{
cout << "B::fun3()" << endl;
}
private:
int b;
};
class C:public A ,public B
{
public:
virtual void fun1()
{
cout << "C::fun1()" << endl;
}
virtual void fun3()
{
cout << "C::fun3()" << endl;
}
private:
int c;
};
void test()
{
A aa;
B bb;
C cc;
}
int main()
{
test();
system("pause");
return 0;
}
代码分析见下面的图中