所有对象都必须有一个共同的基本类型或属于同一类型。
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++ 版本。
在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();