Struktury i C++
Tablice funkcji wirtualnych - proste dziedziczenie

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

Tomasz Kapela, Kraków 2011-2020