You really want smart pointer in this case and superclass doesn't need to have a pointer to itself. You can can store superclass pointer in vector which points to real derived class so the polymorphism still works:
#include <memory>
#include <vector>
struct superclass
{
public:
superclass() : a(0) {}
virtual ~superclass() {} // it's important to define virtual destructor as superclass is a base class
int getA() const { return a; }
private:
unsigned int a;
};
class subclass : public superclass
{
public:
unsigned int b;
};
class subclass2 : public superclass
{
public:
unsigned int b;
};
class runner
{
public:
std::vector<std::unique_ptr<superclass>> superman;
runner()
{
superman.emplace_back(new subclass());
superman.emplace_back(new subclass2());
}
};
Then you can access it simply:
int main()
{
runner r;
std::cout << r.superman[0]->getA() <<" " < <r.superman[1]->getA();
return 0;
}
Side note: hide your data if you can, access data through set/get functions, don't declare members as public.