I want to store objects of classes derived from a common interface (abstract class) in a std::vector of that abstract class. This vector should be filled in a loop and usually I would call the constructor of a class and push the created object into the vector.
As I understand, in case of an abstract class I can only store pointers to that class, so I need to push_back pointers of the derived classes. However, I am not sure about the scope of these newly created objects.
Please, have a look at the code below. This code compiles and works fine but my questions are:
a) Are the objects guaranteed to exist in the second for-loop in the main function? Or might they cease existing beyond the scope of the loop in which they are created?
b) Are all objects' destructors called or might there be memory leaks?
#include<vector>
#include<iostream>
class Interface {
public:
Interface( int y ) : x(y) {}
virtual ~Interface() {}
virtual void f() = 0;
int x;
};
class Derived_A : public Interface {
public:
Derived_A( int y ) : Interface(y) {}
void f(){ return; }
};
class Derived_B : public Interface {
public:
Derived_B( int y ) : Interface(y) {}
void f(){ return; }
};
int main()
{
std::vector<Interface*> abstractObjects;
int N = 5;
for(int ii = 0; ii < N; ii++ )
{
abstractObjects.push_back( new Derived_A(ii) );
abstractObjects.push_back( new Derived_B(ii) );
}
for(int ii = 0; ii < abstractObjects.size(); ii++ )
{
abstractObjects[ii]->f();
std::cout << abstractObjects[ii]->x << '' << std::endl;
}
for(int ii = 0; ii < abstractObjects.size(); ii++ )
{
delete abstractObjects[ii];
}
return 0;
}
See Question&Answers more detail:os