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() |
从上述模型可以看出,虚拟继承的虚函数调用其指针调整极其复杂,因此一般情况下,我建议不要再虚基类中声明非静态的数据成员,以降低指针调整的复杂性。