Konstruktor a polimorfizm

0

Niedawno spodkałem sie z taką oto dość dla mnie opisem w/w w tytule relacji:

O typie obiektu decyduje konstruktor, wywoływany (jawnie lub niejawnie) podczas inicjacji obiektu. Jest to jedyne miejsce, w którym może ulec zmianie "ukryta zmienna wskaźnikowa"

Jestem ciekaw jak jest to realizowane - owa zmiana?
Czy vtable tworzony jest dla całej klasy czy tylko dla obiektu?
Poniższy cytat wydaje mi się na to wskazywać:

Ponieważ zmienna ta jest ukryta przed programistą, mamy gwarancję, że do momentu destrukcji obiektu żadna metoda danej klasy nie zmieni adresu zapisanego w tej ukrytej zmiennej. Zwróćmy uwagę na to, że każdy konstruktor zapisuje w niej adres tablicy wirtualnej zawierającej adresy metod wirtualnych swojej klasy. Jeżeli klasa ma kilka konstruktorów, posługiwać się one będą tą samą tablicą wirtualną. Konstruktory różnych klas posługują się różnymi tablicami wirtualnymi.

Powyższe uwagi pozwalają zrozumieć, dlaczego polimorfizm działa wyłącznie w stosunku do obiektów przekazywanych przez wskaźnik lub referencję, a nie działa przy przekazywaniu obiektów (do lub z funkcji) przez wartość. Tylko wskaźnik i referencja zapewniają nam bowiem dostęp do oryginalnej postaci obiektu, a więc do jego "prawdziwego" zestawu adresów metod wirtualnych. Przekazywanie obiektów przez wartość tak naprawdę zawsze wiąże się z przekazywaniem kopii obiektu. Kopię tę tworzy się na stosie funkcji -- jakżeżby inaczej -- przy pomocy odpowiedniego konstruktora. Ten konstruktor zapisuje w ukrytym wskaźniku adres swojej tablicy wirtualnej. Za pomocą takiej kopii nie można więc uzyskać informacji o rzeczywistym typie oryginalnego obiektu, co wyklucza możliwość zastosowania polimorfizmu.

I tu pojawiaja sie u mnie wątpliwość dlaczego i czy w ogóle jest możliwe zrealizowanie takie scenariusza, w którym dwa rózne konstruktory jednej klasy tworzą obiekty o różnych vtable (różny zestaw funkcji wirtualnych)

0

I tu pojawiaja sie u mnie wątpliwość dlaczego i czy jest możliwe zrealizowanie takie scenariusza, w którym dwa rózne konstruktory jednej klasy tworzą obiekty o różnych vtable (różny zestaw funkcji wirtualnych)

Z tego co mnie uczono to sie nie da, poniewaz VTABLE tworzona jest dla typu obiektu (klasy) a nie samego obiektu i dotyczy tylko i wylacznie funkcji wirtualnych.
Oto definicja z jaka ja sie spotkalem na wykladzie:

Aby umożliwić mechanizm późnego powiązania metody z kodem, kompilator tworzy POJEDYŃCZĄ tablicę zwaną VTABLE dla każdej z klas (nie obiektów), która zawiera funkcje wirtualne. Kompilator umieszcza adresy funkcji wirtualnych dla tejże klasy w VTABLE. W każdej klasie z funkcjami wirtualnymi kompilator niejawnie umieszcza wskaźnik (VPTR), który wskazuje na tablicę VTABLE właściwą dla TYPU obiektu

user image

1 użytkowników online, w tym zalogowanych: 0, gości: 1