In my last engine, ISceneNode had-a IRenderable. In my current engine, IRenderable refers to ISceneNode, and I prefer it this way. Basically, it came down to "Why should a scene node know anything about drawing? It's purely a positional thing." The renderable thing cares about position and orientation, so it asks the scene node, but the scene node is completely ignorant about drawing anything.
Similarly, last time around, my cameras were derived from scene nodes, which I consider in retrospect to be a mistake. Now, cameras refer to scene nodes, but don't derive from them.
So, also, in my way of doing things, multiple renderables can refer to the same scene node.
As for LOD, I'd recommend that you simply treat things generically (ignoring any code or logic flaws - I just typed this in):
class IRenderable{public: IRenderable(INode &node) : mNode(&node) {} virtual tSphere BoundingSphere(void) const = 0; virtual void Render(void) const = 0;protected: ptr<INode> mNode;};class ILODRenderable : public IRenderable{public: typedef pair<float, ptr<IRenderable> > tLOD; virtual void Render(void) const { if (mLODs.empty()) return; float coverage = mNode->ComputeCoverage(BoundingSphere()); tLOD::const_iterator it; for (it = mLODs.begin(); it != mLODs.end(); ++it) { const tLOD &lod = *it; if (lod.first > coverage) { lod.second->Render(); return; } } (mLODs.end() - 1).second->Render(); }private: vector<tLOD> mLODs;};