This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: Where's the vtable?
- From: "Andrea 'fwyzard' Bocci" <fwyzard at inwind dot it>
- To: John Carter <john dot carter at tait dot co dot nz>
- Cc: gcc-help at gcc dot gnu dot org
- Date: Mon, 30 Dec 2002 13:15:24 +0100
- Subject: Re: Where's the vtable?
At 16.01 30/12/2002 +1300, John Carter wrote:
The manual utters these mystic words....
===========================================================================
VTables
C++ virtual functions are implemented in most compilers using a lookup
table, known as a vtable. The vtable contains pointers to the virtual
functions provided by a class, and each object of the class contains a
pointer to its vtable (or vtables, in some multiple-inheritance
situations). If the class declares any non-inline, non-pure virtual
functions, the first one is chosen as the "key method" for the class, and
the vtable is only emitted in the translation unit where the key method is
defined.
Note: If the chosen key method is later defined as inline, the vtable
will still be emitted in every translation unit which defines it. Make
sure that any inline virtuals are declared inline in the class body, even
if they are not defined there.
==========================================================================
Question 1. In the first paragraph, how far does the "non" in "non-pure
virtual function" go? Virtual function that is non-pure? Function that is
non-virtual?
I think you can see it both as non-(pure virtual) function or as (non-pure)
virtual function, as there is no difference in the meaning: the Vtable is
generated if there is at least a function with a body (non pure virtual),
more or less, that needs to be called (non inline).
Question 2. I'm using MockObject's to test my program.
ie. I '#include "MyClass.H"' my class header into MockClass.C and then
define just those methods I'm using for testing. Unfortunately sometimes
this means I get "undefined reference to `vtable for MyClass'" when
linking.
How can I tell which method must I define to get the vtable?
At least one that is NOT inline AND NOT pure virtual. And all the methods
that you call, of course.
Doing the
obvious defining the first function or first virtual function that is
non-pure doesn't seem to help. Perhaps because it is inline? I don't know.
If it's inline, it does not get you a vtable, as the paragraph you quoted says.
It's a pity that the vtable is just a static variable like any other class
static.
Sorry, I couldn't follow you here. What do you mean ?
fwyzard