Как уже говорили другие, почему бы не пропустить приведение? Более того, если вы хотите, чтобы ваши производные классы демонстрировали другое поведение, почему бы не определить явно это другое поведение?То есть использование dynamic_cast<>
говорит о вашем намерении, как и альтернатива.
При этом, как уже говорили другие, ваш базовый класс должен иметь как минимум одну функцию virtual
и ваши производные классы.должно быть публично получено.
class A {
public:
virtual void operator()() {
std::cout << "A\n";
}
virtual void print() {
std::cout << "A\n";
}
virtual ~A() = default;
};
class B : public A {
public:
void operator()() override {
std::cout << "B\n";
}
void print() override {
std::cout << "B\n";
}
};
class C : public A {
public:
void operator()() override {
std::cout << "C\n";
}
void print() override {
std::cout << "C\n";
}
};
int main()
{
std::vector<A*> v;
auto pa = new A{};
auto pb = new B{};
auto pc = new C{};
v.push_back(pa);
v.push_back(pb);
v.push_back(pc);
for(auto& elem : v)
elem->print();
delete pa;
delete pb;
delete pc;
return 0;
}
Я думаю, что это часть ответа на ваш вопрос.Я думаю, что на другую часть вашего вопроса можно ответить:
std::vector<A> vv;
A a;
B b;
C c;
a(); // A
b(); // B
c(); // C
vv.push_back(a);
vv.push_back(b);
vv.push_back(c);
for(auto& elem : vv)
elem(); // ?