#include <vector>
#include <iostream>
using namespace std;
class Base
{
public :
virtual void sayHello( )
{
cout << "Hello from Base\n " ;
}
} ;
class Derived1 : public Base
{
public :
virtual void sayHello( )
{
cout << "Hello from Derived1\n " ;
}
} ;
class Derived2 : public Base
{
public :
virtual void sayHello( )
{
cout << "Hello from Derived2\n " ;
}
} ;
vector< Base* > elements;
template < class T>
void deleteByType( )
{
for ( int i = 0 ; i < elements.size ( ) ; i++ )
{
T* a = dynamic_cast < T* > ( elements[ i] ) ;
if ( a ! = nullptr)
{
delete a;
elements.erase ( elements.begin ( ) + i) ;
cout << i << "th element deleted\n " ;
i-- ;
}
}
}
int main( )
{
elements.push_back ( new Derived1) ;
elements.push_back ( new Derived2) ;
elements.push_back ( new Derived2) ;
elements.push_back ( new Derived1) ;
for ( Base* element : elements)
{
element- > sayHello( ) ;
}
deleteByType< Derived1> ( ) ;
for ( Base* element : elements)
{
element- > sayHello( ) ;
}
for ( Base* element : elements)
{
delete element;
}
elements.clear ( ) ;
return 0 ;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEJhc2UKewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgc2F5SGVsbG8oKQogICAgewogICAgCWNvdXQgPDwgIkhlbGxvIGZyb20gQmFzZVxuIjsKICAgIH0KfTsKCmNsYXNzIERlcml2ZWQxIDogcHVibGljIEJhc2UKewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgc2F5SGVsbG8oKQogICAgewogICAgCWNvdXQgPDwgIkhlbGxvIGZyb20gRGVyaXZlZDFcbiI7CiAgICB9Cn07CgpjbGFzcyBEZXJpdmVkMiA6IHB1YmxpYyBCYXNlCnsKcHVibGljOgoJdmlydHVhbCB2b2lkIHNheUhlbGxvKCkKCXsKCQljb3V0IDw8ICJIZWxsbyBmcm9tIERlcml2ZWQyXG4iOwoJfQp9OwoKdmVjdG9yPEJhc2UqPiBlbGVtZW50czsKCnRlbXBsYXRlIDxjbGFzcyBUPgp2b2lkIGRlbGV0ZUJ5VHlwZSgpCnsKCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspCgl7CgkJVCogYSA9IGR5bmFtaWNfY2FzdDxUKj4oZWxlbWVudHNbaV0pOwoJCWlmIChhICE9IG51bGxwdHIpCgkJewoJCQlkZWxldGUgYTsKCQkJZWxlbWVudHMuZXJhc2UoZWxlbWVudHMuYmVnaW4oKSArIGkpOwoJCQljb3V0IDw8IGkgPDwgInRoIGVsZW1lbnQgZGVsZXRlZFxuIjsKCQkJaS0tOwoJCX0KCX0KfQoKaW50IG1haW4oKQp7CgllbGVtZW50cy5wdXNoX2JhY2sobmV3IERlcml2ZWQxKTsKCWVsZW1lbnRzLnB1c2hfYmFjayhuZXcgRGVyaXZlZDIpOwoJZWxlbWVudHMucHVzaF9iYWNrKG5ldyBEZXJpdmVkMik7CgllbGVtZW50cy5wdXNoX2JhY2sobmV3IERlcml2ZWQxKTsKCQoJZm9yIChCYXNlKiBlbGVtZW50IDogZWxlbWVudHMpCgl7CgkJZWxlbWVudC0+c2F5SGVsbG8oKTsKCX0KCQoJZGVsZXRlQnlUeXBlPERlcml2ZWQxPigpOwoJCQoJZm9yIChCYXNlKiBlbGVtZW50IDogZWxlbWVudHMpCgl7CgkJZWxlbWVudC0+c2F5SGVsbG8oKTsKCX0KCQoJCglmb3IgKEJhc2UqIGVsZW1lbnQgOiBlbGVtZW50cykKCXsKCQlkZWxldGUgZWxlbWVudDsKCX0KCWVsZW1lbnRzLmNsZWFyKCk7CglyZXR1cm4gMDsKfQ==