Z pewnością nie ma problemu z cięciem - twoje klasy nie wymagają vtables, ponieważ nie mają funkcji wirtualnych, ale nawet jeśli je mają, pass-by-reference nie kopiuje obiektu, a tym samym nie robi " ciąć cokolwiek.
Możesz wykonywać połączenia wirtualne za pomocą referencji dokładnie tak, jak to możliwe za pomocą wskaźników. O ile wiem, nie ma praktycznego powodu, tylko dla stylu.
Może to zrobić z faktem, że polimorficzne obiekty są zazwyczaj stworzony przez wskaźnik z new
i oczywiście muszą być przechowywane w pojemnikach przez wskaźnik (lub inteligentnego wskaźnika), ponieważ nie można mieć pojemnik z referencjami. Może wtedy wydawać się bardziej konsekwentne manipulowanie nimi za pomocą wskaźnika zawsze.
Ponadto, jeśli chcesz używać OperateOnObject
w standardowym algorytmie, takim jak for_each
, musisz zaakceptować typ elementu kontenera, który jest wskaźnikiem, lub musisz go zawinąć w adapter funkcyjny, który dereferencja. Standardowy C++ nie ma tego adaptera, więc jest to świat trudu, by oprzeć swój styl na nim.
pokrewne: zobacz, co się stanie, jeśli OperateOnObject
bierze odniesienie i iteracyjne swoje wektorowej za pomocą iteratorów:
for (vector<Base*>::iterator i = objects.begin(); i != objects.end(); ++i) {
OperateOnObject(**i);
}
20. czas, że dwukrotnie wskazanie pośrednie denerwuje lub dezorientuje cię, będzie zmienić podpis OperateOnObject
; -)
Na marginesie, niektóre przewodniki stylów ostrzegają przed przekazywaniem referencji bez stałych, niezależnie od tego, czy typ jest polimorficzną klasą podstawową, na podstawie której nie można od razu odróżnić przejścia od referencji do podania -do-wartości, gdy czytasz kod na stronie połączenia. Więc wolą, aby OperateOnObject
wziął wskaźnik mimo to.
Osobiście uważam, że argument ten jest trochę słaby - nazwa funkcji powinna informować cię z grubsza o tym, co robi, a zwłaszcza oświadczenie takie jak ChangeTheObject(my_object);
nie jest tak subtelnie podpowiedziane dla mnie, ponieważ nie używa żadnej wartości zwracanej , musi zmienić swój argument. Ale zgadzam się, że jeśli odpowiednio podążasz za stylem, możesz wyraźnie i konsekwentnie odróżniać mutatory od czystych funkcji.
We wszystkich projektach, w których pracowałem, preferencje wskaźnika w stosunku do referencji zawsze zależały od czegoś innego niż od polimofizmu ... – PlasmaHH
Dodatkowym czynnikiem jest to, że w VisualStudio pojawia się dużo więcej informacji o debugowaniu dla wskaźników (np. wpisz info dla najbardziej wyprowadzonego typu) niż dla referencji, więc jest to również czynnik preferujący jeden względem drugiego. –
W dobrym projekcie (nie) umiejętności IDE/debuggera nie powinny wpływać na podstawowe właściwości projektu. – PlasmaHH