基本语言细节----虚函数表的演示(基于上篇文章的理论介绍)
作者:卧浪居士
以下内容均是在VS2012中测试所得:
设计三个类 A,C,B;
(1)B以单独形式出现,不继承类A、C,观察其对象模型如下图。
(2)B以公有继承的方式继承A、C,其对象模型如下图所示:
由 (1)、(2)可知:
1.类的成员函数不在对象内。(这与深入探索C++对象模型描述一致)
2.虚函数表用指向指针的指针来实现的。
3.带有虚函数的类,单独出现时均有虚函数表,但是在继承后,子类中独有的虚函数表消失,而只剩下基类的虚函数表,并且基类的虚函数表,按照子类继承基类的定义顺序排列。
4.虚函数表内存放的是虚函数的函数指针。(要么是改写的,要么是未被改写的)
卧浪居士 于HUST2013.11.19
附录:
class A
{public:
A()
{
}
virtual void print1 ()
{
cout<<" A 1 ";
}
virtual void print2 ()
{
cout<<2<<"A 2 ";
}
virtual void print3 ()
{
cout<<3<<"A 3 ";
}
protected:
private:
int n1;
int n2;
};
class C
{
public:
C()
{
n2=0;
n1=n2+2;
}
public:
virtual void print4 ()
{
cout<<" C 4 ";
}
virtual void print5 ()
{
cout<<" C5 ";
}
virtual void print6 ()
{
cout<<3<<" C6 ";
}
protected:
private:
int n1;
int n2;
};
class B :public A,public C
{
virtual void print7 ()
{
cout<<"B 7";
}
virtual void print8 ()
{
cout<<"B 8";
}
virtual void print9 ()
{
cout<<"B 9";
}
void printB()
{
cout<<"Member function";
}
private:
int n3;
int n4;
};