在C ++中与类多重继承共享变量

时间:2017-02-19 15:38:03

标签: c++ multiple-inheritance diamond-problem

我正在尝试为我的物理模拟设计类层次结构。我真的想在类之间共享变量(例如Vec3d posQuat4d rot),这些变量通过更复杂的多重继承图相互依赖。我提取了简单示例问题是什么(完整代码是here):

// ==== prefabricates for classes ... I was thinking this will solve the problem
class _pos { public: Vec3d pos;};
class _rot { public: Quat4d rot;};

// === classes 

class KinematicBody : public _pos, public _rot{
    // pos, rot   ... inherited
    void toGLmat( float * mat ); // make Opengl 4x4 matrix for rendering
};

class PointBody : public _pos, public Updateable {
    public:
    // pos    ...  inherited
    Vec3d   vel,force;
    double  mass;

    inline  void update_(double dt){ vel.add_mul(force, dt); pos.add_mul(vel,(dt/mass)); };  // can be called as obj->PointBody::update_(dt);
    virtual void update (double t, double dt ){ update_(dt); }; // implements Updateable
};

// !!!! HERE IS THE PROBLEM
class RigidBody : public PointBody, public KinematicBody {  // WARRNING : both PointBody and KinematicBody inheriate "pos"
   public:
   // pos,vel,force,mass,rot    ...  inherited
   Mat3d  momentOfInertia;
   Vec3d  torque;
   Vec3d  angular_velocity;
};

我尝试运行以下测试,以确保KinematicBody::posPointBody::posRigidBody::pos共享同一块内存(完整代码here):

RigidBody        rb;
KinematicBody  * kb = &rb;
PointBody      * pb = &rb;

rb. pos.set(1.0); printf( "%f %f %f\n", rb.pos.x, kb->pos.x, pb->pos.x );
kb->pos.set(2.0); printf( "%f %f %f\n", rb.pos.x, kb->pos.x, pb->pos.x );
pb->pos.set(3.0); printf( "%f %f %f\n", rb.pos.x, kb->pos.x, pb->pos.x );

我期待的结果如

1.0000   1.0000   1.0000
2.0000   2.0000   2.0000
3.0000   3.0000   3.0000 

但我得到了以下错误:

error: request for member ‘pos’ is ambiguous  
rb. pos.set(1.0); printf( "%f %f %f\n", rb.pos.x, kb->pos.x, pb->pos.x );

可以通过制作

来解决此错误

class RigidBody : public PointBody, public _rot {

而不是

class RigidBody : public PointBody, public KinematicBody {

但是我无法从void toGLmat( float * mat );继承KinematicBody ......而且一般来说,它使课程的构成非常不稳定

有没有办法实现这种分享?我想通过制作 prefabricates ,如_pos_rot,我可以做到这一点,但显然不是。

0 个答案:

没有答案