c / expert
Snippet
Abstract Interface Dispatch via VTable Struct Pointer
This snippet demonstrates Object-Oriented polymorphism in pure C using Virtual Method Tables (VTables). An abstract base struct contains a pointer to a struct of function pointers (the VTable). Concrete implementations embed the base struct and point its vtable member to a statically defined table of concrete implementation callbacks, enabling dynamic method invocation without memory overhead.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>typedef struct LoggerVTable LoggerVTable;typedef struct {const LoggerVTable *vtable;} Logger;struct LoggerVTable {void (*log)(Logger *self, const char *msg);};typedef struct {Logger base;const char *prefix;} ConsoleLogger;static void console_log_impl(Logger *self, const char *msg) {ConsoleLogger *cl = (ConsoleLogger *)self;printf("[%s] %s\n", cl->prefix, msg);}static const LoggerVTable CONSOLE_LOGGER_VTABLE = {.log = console_log_impl};void console_logger_init(ConsoleLogger *cl, const char *prefix) {cl->base.vtable = &CONSOLE_LOGGER_VTABLE;cl->prefix = prefix;}void logger_dispatch(Logger *logger, const char *msg) {if (logger && logger->vtable && logger->vtable->log) {logger->vtable->log(logger, msg);}}
Breakdown
1
struct LoggerVTable {
Defines the virtual table layout containing function pointers for interface methods.
2
void (*log)(Logger *self, const char *msg);
Declares a function pointer receiving the explicit 'self' instance reference.
3
ConsoleLogger *cl = (ConsoleLogger *)self;
Downcasts the base struct pointer back to the derived type to access implementation state.
4
cl->base.vtable = &CONSOLE_LOGGER_VTABLE;
Binds the instances' virtual table pointer to the static dispatch table during initialization.
5
logger->vtable->log(logger, msg);
Executes dynamic dispatch by dereferencing the virtual method from the instance vtable.