an idea I have right now while considering encapsulating the two kinds of quaternions as members in My Quaternion class (which btw has no w,x,y,z members so there aren't three of the data) is to put an "iReal2" (or invisibleInterfaceToTwoRealsAsOneReal) class in there which is this: class MyQuaternion { . . . mutable class iReal2 { public: iReal2(Real* v1, Real* v2) : val1(v1), val2(v2) {}; Real* val1, * val2; inline operator Real () { return *val1; } inline Real operator = (Real r) { *val1 = *val2 = r; return *val1; } inline Real operator += (Real r) { *val1 = *val2 += r; return *val1; } inline Real operator -= (Real r) { *val1 = *val2 -= r; return *val1; } inline Real operator *= (Real r) { *val1 = *val2 *= r; return *val1; } inline Real operator /= (Real r) { *val1 = *val2 /= r; return *val1; } } w, x, y, z; private: Ogre::Quaternion mOgreQuat; opal::Quaternion mOpalQuat; }; and at initialisation I pass the w, x, y and z constructors the adresses to the mOgreQuat and mOpalQuat's w, x, y and z so that when I do this: MyQuaternion myQuat; myQuat.x = 2.501; the iReal2 operator = (Real r) will at its own discretion update both its parent Quaternions mOpalQuat.x and mOgreQuat.x. So... I don't know.. this might be a stupid trick just to make it invisible (maybe using myQuat.setX(Real); would be better for performance (not to mention code-sense-making)? since there's no polymorphism with the other Quaternion classes anyway..)