To answer the first part of your question, you must create an object of type Player before you can use it. When you say
push_back(Player), it means “add the Player class to the vector”, not “add an object of type Player to the vector” (which is what you meant).
You can create the object on the stack like this:
Player player; vectorOfGamers.push_back(player); // <-- name of variable, not type
Or you can even create a temporary object inline and push that (it gets copied when it’s put in the vector):
vectorOfGamers.push_back(Player()); // <-- parentheses create a "temporary"
To answer the second part, you can create a vector of the base type, which will allow you to push back objects of any subtype; however, this won’t work as expected:
vector<Gamer> gamers; gamers.push_back(Dealer()); // Doesn't work properly!
since when the dealer object is put into the vector, it gets copied as a Gamer object — this means only the Gamer part is copied effectively “slicing” the object. You can use pointers, however, since then only the pointer would get copied, and the object is never sliced:
vector<Gamer*> gamers; gamers.push_back(new Dealer()); // <-- Allocate on heap with `new`, since we // want the object to persist while it's // pointed to