I think that the elegance can stay at second place if one can dispose of such powerful method that resolve many (all?) kind of problems with embedded ctrl.
Yes, the only problem is that sometimes there exists elegant solution...
E.g. in this case, other interface solution I am considering is to alternatively pass
Array<T>
to the "Ctrls" method,
void Ctrls<T>(Array<T>& ctrls);
so that ArrayCtrl would create its stuff in the place you have "external" access to. This way, downcasts would not be necessary.
OTOH, current inteface cannot be now removed (that is why I am always afraid when creating new stuff....), so Ctrl *GetCtrl method addition is very likely...