모든 개체는 공통 기본 유형 또는 동일한 유형이어야합니다.
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};
및 루프
int length = (sizeof(list)/sizeof(Base*));
for(int i = 0; i < length; ++i) list[i]->callSameMethod();
또는 표준에 대한 일반을 사용하여 반복 ::의 for_each를
#include <algorithm>
#include <functional>
std::for_each(list, list + length, std::mem_fun(&Base::callSameMethod));
나는 이 경우 n std :: vector. 벡터를 사용하면 초기화 및 반복에 지나치게 자세한 구문을 사용해야하므로 속도가 훨씬 느려집니다.
당신이 훨씬 더 간단한 해결책이있다 그러나 C++ 11을 지원하는 컴파일러가있는 경우 : 이니셜 라이저 목록의 모든 요소가 같은 포인터 타입, Base*
이어야한다는
#include <initializer_list>
for (auto i : {Alice, Bob, YoYo}) i->callSameMethod();
참고. 그렇지 않은 경우 이니셜 라이저 목록 유형을 명시해야합니다.
// 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();
이러한 객체는 배열 또는 표준 라이브러리 컨테이너에 있습니까? – Blastfurnace
그렇지 않다면 다음과 같이하십시오. –
그들은 같은 유형 또는 기본 유형입니까? –