I would say that the compiler is right to warn you about a non-virtual destructor in the base class. You created a class that is explicitly intended as the root of the inheritance hierarchy, but by creating a non-virtual destructor class, you violated your ability to delete an object with a pointer to the base class (since everything that is executed is a destructor of the base class, so no derived classes will be executed ) This is considered a very bad idea in C ++, since you are significantly disrupting the implementation of polymorphism when it comes to this hierarchy of objects.
As you mentioned in your comments, your goal is to use the GenericSymbolGenerator as an interface and force the user to instantiate and use derived classes containing the actual implementation code. The canonical way to declare an interface in C ++ is to declare at least one interface function as a pure virtual function. This prevents you from creating an instance of the base class, but at the same time creating instances of derived classes. You already did this by declaring generateSymbolTableCollection() pure virtual function in the base class. So all you have to do is make a virtual virtual destructor, since it really has to be virtual in this particular scenario.
Also, as an aside, canonical signatures for the default constructor and destructor are usually written without using "void" as a parameter, just use empty brackets instead.
source share