Обычный способ создать указатель, который может указывать на любой из двух, состоит в том, чтобы заставить их наследовать от общего базового класса.Любой указатель базового класса может указывать на любой подкласс.Обратите внимание, что таким образом вы можете получить доступ только к элементам, которые являются частью базового класса через этот указатель:
class Base {
public:
int a;
};
class Sub1 : public Base {
public:
int b;
};
class Sub2 : public Base {
public:
int c;
};
int main() {
Base* p = new Sub1;
p.a = 1; // legal
p.b = 1; // illegal, cannot access members of sub-class
p = new Sub2; // can point to any subclass
}
То, что вы пытаетесь достичь, называется полиморфизм , и это одинфундаментальных концепций объектно-ориентированного программирования.Один из способов получить доступ к члену подкласса - уменьшить указатель.Когда вы делаете это, вы должны убедиться, что вы приведете его к правильному типу:
static_cast<Sub1*>(p).b = 1; // legal, p actually points to a Sub1
static_cast<Sub2*>(p).c = 1; // illegal, p actually points to a Sub1
Что касается вашего второго вопроса, используя технику, описанную выше, вы можете создать набор указателей на базу-класс, который может содержать экземпляр любого из подклассов (они также могут быть смешаны):
std::set<Base*> base_set;
base_set.insert(new Sub1);
base_set.insert(new Sub2);