Все объекты должны иметь общий базовый тип или быть одного типа.
class Base { public: virtual void callSameMethod() = 0; }; // abstract base
class Derived1 : public Base { public: virtual void callSameMethod() {:::}; };
class Derived2 : public Base { public: virtual void callSameMethod() {:::}; };
// instances
Base* Alice = new Derived1;
Base* Bob = new Derived2;
Base* YoYo = new Derived1;
Если у вас есть это, наиболее элегантное решение зависит от вашей версии C ++.
In C ++ 03 Вы можете создать контейнер, который включает указатели на все элементы
Base* const list[] = {Alice, Bob, YoYo};
и выполнять итерацию по нему, используя обычный цикл for
int length = (sizeof(list) / sizeof(Base*));
for(int i = 0; i < length; ++i) list[i]->callSameMethod();
или std:: for_each
#include <algorithm>
#include <functional>
std::for_each(list, list + length, std::mem_fun(&Base::callSameMethod));
Я не рекомендую использовать std :: vector в этом случае.Вектор вынуждает вас использовать слишком подробный синтаксис для инициализации и итерации и также будет намного медленнее.
Если у вас есть компилятор, который поддерживает C ++ 11 , однако существует гораздо более простое решение:
#include <initializer_list>
for (auto i : {Alice, Bob, YoYo}) i->callSameMethod();
Обратите внимание, что все элементы в списке инициализатора должны бытьс указателем того же типа, Base*
.Если это не так, тип списка инициализатора должен быть явно указан:
// alternative declarations with different pointer types
Derived1* Alice = new Derived1;
Derived2* Bob = new Derived2;
Derived1* YoYo = new Derived1;
auto objects = std::initializer_list<Base*>{Alice, Bob, YoYo};
for (auto i : objects) i->callSameMethod();