Der übliche Weg, um einen Zeiger zu erstellen, der auf eines der beiden zeigen kann, besteht darin, sie von einer gemeinsamen Basisklasse erben zu lassen. Jeder Zeiger der Basisklasse kann auf eine beliebige Unterklasse zeigen. Beachten Sie, dass Sie auf diese Weise nur auf Elemente zugreifen können, die Teil der Basisklasse sind, über diesen Zeiger:
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, kann nicht auf Elemente der Unterklasse zugreifen
p = new Sub2; // kann auf jede Unterklasse zeigen
}
Was Sie erreichen möchten, wird als Polymorphismus bezeichnet und ist eines der grundlegenden Konzepte der objektorientierten Programmierung. Ein Weg, um auf Elemente der Unterklasse zuzugreifen, besteht darin, den Zeiger zu downcasten. Wenn Sie dies tun, müssen Sie sicherstellen, dass Sie ihn auf den korrekten Typ casten:
static_cast(p)->b = 1; // legal, p zeigt tatsächlich auf ein Sub1
static_cast(p)->c = 1; // illegal, p zeigt tatsächlich auf ein Sub1
Was Ihre zweite Frage betrifft, mit der oben beschriebenen Technik können Sie eine Reihe von Zeigern auf eine Basisklasse erstellen, die dann Instanzen einer beliebigen Unterklasse halten können (diese können auch gemischt sein):
std::set base_set;
base_set.insert(new Sub1);
base_set.insert(new Sub2);