Yes, but you’ll need to use either pointers or smart pointers (I’d go with this).
struct X
{
virtual ~X() {} //<--- as pointed out in the comments
// a virtual destructor is required
// for correct deletion
virtual void foo() = 0;
};
struct Y : X
{
virtual void foo() { }
};
int main()
{
std::vector<X*> a;
a.push_back(new Y);
a[0]->foo();
for ( int i = 0 ; i < a.size() ; i++ )
delete a[i];
return 0;
}
Don’t forget to delete the allocated memory.
Why you can’t use actual objects:
Assume std::vector<X>
. This is illegal because:
-
If you want to initialize your vector with some number of elements, the allocation would fail. A vector stores objects internally in continuous memory. A preallocation would fail because it would mean it needed to create objects, which can’t be done for abstract classes.
-
Even if you could, or the base class wasn’t abstract, it wouldn’t help too much, as you’d suffer from object slicing.