Dobra, bo ja już mam dość słów kluczowych, dalej nie mogę sobie poradzić z tym wcześniejszym bo mój pomysł okazał się niemożliwy do zrealizowania (albo nie wiem że tak można)
Chciałem w tej klasie MailBox dodać metodę wirtualną, coś w stylu get, która na wyjściu zwracała by wybrany (przez konstruktor) host, wtedy zapis byłby bardzo prosty.
Na początku chciałem wykorzystać tą funkcję template, bo można by ustawić typ zwracane wartości na obiekt konkretnego hosta. Ale do działania wymaga argumentu na podstawie, którego ustala typ wyjściowy, więc to odpada, bo wróciłbym do tego co na początku( stos deklaracji lub stos argumentów, do wyboru).
Chciałem też stworzyć przeciążoną wersję funkcji z różnymi zwracanymi wartościami (czyli hostami), ale takich funkcji nie można budować tylko na podstawie zwracanej wartości, więc to też odpada.
Z tego wszystkiego i tak nie za bardzo wiem jak to zrobić, bo żeby zapis mógł wyglądać, np. "m_box->Do()->Create();" funkcja Do() musi mieć w return odpowiedni typ. Nie wiem jak inaczej to zrobić by uzyskać coś takiego.
Co do Twojego pytania. Jest bezpośrednio powiązane z problemem wyżej. W pewnym momencie uznałem, że można porobić deklaracje tych typów, poprzez konstruktor stworzyć odpowiedni obiekt, a funkcja już potem tylko zwracać ten właściwy. No ale właśnie jest problem zwracanej wartości.
Może można to zrobić inaczej, ale aż tak obeznany we wszystkich technikach nie jestem i nic innego nie przychodzi mi do głowy
A klasa MailBox jest klasa abstrakcyjną, wyrzuciłem z niej wszystko, został tylko domyślny konstruktor, wirtualny destruktor i funkcja czysto wirtualna Do(). Poza tym, jest słowo kluczowe abstract przy nazwie klasy.