- 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.