Допустим, у меня есть два абстрактных класса, A1
и A2
.A1
имеет функцию с именем foo()
, A2
имеет функцию с именем bar()
.Я создаю много разных дочерних классов этих базовых классов, скажем C1,C2,C3
, ..., которые могут наследовать или не наследовать A1
и / или A2.
Теперь я хочу перебрать все классы типа A1
и всеклассы типа A2
и вызова foo()
или bar()
.Мой вопрос: каков наилучший способ добиться этого?Мой подход состоит в том, чтобы использовать либо умные указатели, либо векторы, которые содержат экземпляры C1,C2,...
, то есть:
std::vector<C1> c1s;
std::vector<C2> c2s;
std::unique_ptr<C3> c3;
...
Затем я объявляю два целых числа n_A1
и n_A2
, которые указывают, сколько у меня есть экземпляров.каждого абстрактного класса A1
и A2
.Затем я определяю два массива указателей:
A1 **a1s = new A1*[n_A1];
A2 **a2s = new A2*[n_A2];
и затем вручную добавляю все адреса экземпляров в эти массивы.Например, если c1s
имеет длину 2, c2s
имеет длину 3, и если C1
наследует A1
, C2
наследует A2
, C3
наследует A1
и A2
, я бы сделал:
a1s[0]=&c1s[0];
a1s[1]=&c1s[1];
a2s[0]=&c2s[0];
a2s[1]=&c2s[1];
a2s[2]=&c2s[2];
a1s[2]=c3.get();
a2s[3]=c3.get();
Таким образом, n_A1=3
и n_A2=4
, и теперь я могу перебирать массивы адресов a1s и a2s и вызывать функции foo()
или bar()
.При удалении экземпляра, содержащего все эти объекты, мне просто нужно освободить массивы a1s
и a2s
.
. Постоянно рекомендуется не использовать необработанные указатели в C ++. Интересно, это хороший способрешить эту проблему?Есть ли риски с таким подходом?Есть ли лучший способ сделать это?