 <p>If you declare virtual functions you should also declare your destructor virtual ;-).</p> <ol> <li><p>B has a virtual table, because it has a virtual function, namely <code>func0()</code>. If you declare a function (including a destructor) virtual in a base class, all its derived classes will have the function with same signature virtual as well. And it will cause them to have a vtable. Moreover, B would have the vtable even if you didn't declare <code>func0</code> in it explicitly.</p></li> <li><p>Non-virtual functions are not referenced through vtables.</p></li> <li><p>See 2.</p></li> <li><p>No. Classes' vtables are constructed based on class declarations. The bodies of class' functions (let alone other functions) are not taken into account. Therefore, B has a vtable, because its function <code>func0()</code> is virtual.</p></li> </ol> <p>There also is a tricky detail, although it's not the gist of your question. You declared your function <code>B::func0()</code> as inline. In <code>gcc</code> compiler, if a virtual function is declared inline, it retains its slot in virtual table, the slot pointing to a special function emitted for that inline one (that counts as taking its address, which makes the inline emitted). That means, whether the funciton is inline doesn't influence amount of slots in vtable and its necessity for a class.</p>