typeid
+ dynamic_cast
#include <iostream>
#include <vector>
#include <random>
#include <typeinfo>
using namespace std;
class Foo {
public:
virtual ~Foo(){}
};
class Bar: public Foo {
private:
size_t c;
static size_t n;
public:
Bar(): c(n++){};
virtual ~Bar(){};
size_t getC() const {return c;};
};
size_t Bar::n(0);
int main() {
std::mt19937 gen;
std::uniform_int_distribution<unsigned> dis(0, 2);
vector<Foo*> vec;
for(size_t i = 0; i < 100; ++i) {
if(dis(gen))
vec.push_back(new Foo);
else
vec.push_back(new Bar);
}
for(auto p: vec) {
if(typeid(*p) == typeid(Bar))
cout << dynamic_cast<Bar*>(p)->getC() << endl;
}
for(auto p: vec)
delete p;
return 0;
}
dynamic_cast
, но тогда придётся обрабатывать исключения.