1.1.1. 虚拟继承下的虚成员函数
0001 class Point2d
0002 {
0003 public :
0004 Point2d(float x=0.00, float y=0.00);
0005 virtual ~Point2d();
0006 virtual void mumble();
0007 virtual float Z() {return 0;};
0008 protected :
0009 float _x, _y;
0010 };
0011 class Point3d : public virtual Point2d
0012 {
0013 public :
0014 Point3d(float x=0.00, float y=0.00, float z=0.00);
0015 virtual ~Point3d();
0016 virtual float Z() {return _z};
0017 protected :
0018 float _z;
0019 };
对象模型如下:
Point2d Object virtual Table Point2d
_x
_y
vptr_2d
#0
type_info for Point2d
#1
Point2d::~Point2d()
#2
Point2d::mumble()
#3
Point2d::z()
Point3d Object virtual Table Point3d
_z
vptr_3d
_x
_y
vptr_2d
#0
type_info for Point3d
#1
Point3d::~Point3d()
#2
Point2d::mumble()
#3
Point3d::z()
virtual Table Point2d Subobject for Point3d
#0
type_info for Point3d
#1
Point3d::~Point3d()
#2
Point2d::mumble()
#3
Point3d::z()
从上述模型可以看出,虚拟继承的虚函数调用其指针调整极其复杂,因此一般情况下,我建议不要再虚基类中声明非静态的数据成员,以降低指针调整的复杂性。