Thanks,
so at the moment I cant think of a situation, but its more about future design, as I wanted to design the Base classes so they sere inherited from.
If the baseGraph is the only thing that knows of all the nodes in the graph in the vector, then that seems fine to me.
But if a user inherited twice say from BaseNode and created two different types of DerivedNode, then added them both to the vector - and gave them each specific functions that were not overriding functions in BaseNode, then they could not just iterate over the vector and run those functions as not all nodes would have all methods.
So my question is, is the bad design that they are adding different types of nodes to the vector owned by graph, or that I am storing all nodes that derive from BaseNode in a vector of BaseNodes?

Secondly, what is the way to handle that - i.e if there are two types of DerivedNode and the graph has a list of all nodes, but the user wants to process al DerivedNodeType1 nodes, then should they be adding them to their DerivedGraph class as another vector for each type, or should they be checking the type of a node in the vector of BaseNode types in BaseGraph?

Thinking about it, they should be storing their own vector of their own types of nodes if they need to treat them differently. It just doesnt feel too generic - by that I mean, I want BaseGraph to have a list of all nodes in existence, but should the DerivedGraph have the granular knowledge of different types of Node?