Jeżeli klasa bazowa i potomna nie mają funkcji wirtualnych to obiekty nie posiadają wskaźników do tablicy funkcji wirtualnych.
class A { public: int a; }; class B : public A { public: int b; }; | A --> +---------+
| a |
+---------+
B --> +---------+
| a |
+---------+
| b |
+---------+ |
Jeżeli w klasie są obecne funkcje wirtualne to obiekt posiada wskaźnik do tablicy funkcji wirtualnych.
class A { public: int a; virtual void v(); }; class B : public A { public: int b; virtual void w(); void f(); };
+-----------------+
| 0 (top_offset) |
B ------------------+ typeinfo
>+--------+ | wsk do typeinfo |----> dla B
| vtable |---> +-----------------+
+--------+ | * A::v() |----> A::v(){}
| a | +-----------------+
+--------+ | * B::w() |----> B::w(){}
| b | +-----------------+
+--------+
Jeżeli w klasie B nadpiszemy funkcję v to w vtable zmieni się wskaźnik.
class A { public: int a; virtual void v(); }; class B : public A { public: int b; void v(); virtual void w(); void f(); };
+-----------------+
| 0 (top_offset) |
B ------------------+ typeinfo
>+--------+ | wsk do typeinfo |----> dla B
| vtable |---> +-----------------+
+--------+ | * A::v() |--+ A::v(){}
| a | +-----------------+ +-> B::v(){}
+--------+ | * B::w() |----> B::w(){}
| b | +-----------------+
+--------+