You could consider an approach where you head more towards separation of graphics and logics. That is, the scene graph itself isn't drawable, but rather contains transformable properties, and a pointer to some drawable object (e.g. std::unique_ptr<DrawableObject>). Like this, you can extract the rendering task from the scene graph.
To fix the problem of a different rendering order, you can either build your scene graph in a way such that objects are traversed in the correct order. Or, you iterate through all nodes and store the respective drawables in a std::set<DrawableObject*, MyCustomOrder>. DrawableObject can be a custom class with a Z coordinate, and MyCustomOrder is a functor that sorts by this Z component. After traversing the scene graph, you iterate through the set and draw all objects.