- Czy da się jakoś dostać do Vtable, albo Vptr?
To c++, więc da się ... jak wiesz gdzie szukać, to możesz skakać po pamięci ... tylko po co? To jest z tego co pamiętam, zdefiniowane przez ABI, które jest zastosowane.
- Sprawdzałem rozmiar pustej klasy metodą 'sizeof' i wynosi on 1 bajt, dlaczego nie 0? Po dodaniu funkcji wirtualnej wynik to 4, rozumiem, że to przez dodanie Vptr-a, ale jeśli pusta klasa ma 1 bajt to wskaźnik miałby 3 bajty(domyślam się, że klasa tak naprawdę nie ma rozmiaru)?
Ten 1 bajt został dodany sztucznie. Jak inaczej zaalokować pustą klasę i zapewnić arytmetyką wskaźnikową (czyli ta pusta klasa, z jakiegoś dziwnego powodu wsadzona do tablicy)?
Po dodaniu funkcji wirtualnych pojawił się vtable i vptr i nie było sensu dodawać bajta.
- Dziedziczenie po klasie wirtualnie np.
class Derived : virtual public Base, stosuje się wyłącznie przy problemie diamentu, czy jest to bardziej zaawansowany mechanizm? Na czym polega jego działanie(link)?
Wspólne klasy bazowe nie są duplikowane. Najlepiej nie stosować jak nie trzeba ;)
- Poniższy kod się kompiluje i o dziwo działa poprawnie, czy jest to
undefined behavior?
Tak. Bo klasa Cat mogłaby się odnosić do jakiś danych, których przecież w obiekcie typy Dog nie ma. Adres w pamięci takich danych zostanie obliczony względem klasy Dog, czyli czytasz/modyfikujesz nie wiadomo co.