#include <stdio.h>
typedef struct {
int (*myFunc1) ();
int (*myFunc2) ();
} VTable;
typedef struct {
const VTable* _vtable;
int a, b;
} Base;
typedef struct {
Base _base;
} Derived1;
typedef struct {
Base _base;
} Derived2;
int Derived1_myFunc1 () {
return 1;
}
int Derived1_myFunc2 () {
return 2;
}
int Derived2_myFunc1 () {
return 3;
}
int Derived2_myFunc2 () {
return 4;
}
const VTable vtableDerived1 = { &Derived1_myFunc1, &Derived1_myFunc2 };
const VTable vtableDerived2 = { &Derived2_myFunc1, &Derived2_myFunc2 };
void Derived1_Construct (Derived1* instance) {
instance->_base._vtable = &vtableDerived1;
}
void Derived2_Construct (Derived2* instance) {
instance->_base._vtable = &vtableDerived2;
}
/// -----
void someFunction (Base* base) {
int x = (base->_vtable->myFunc1) ();
int y = (base->_vtable->myFunc2) ();
}
int main () {
Derived1 d1;
Derived1_Construct (&d1);
Derived2 d2;
Derived2_Construct (&d2);
someFunction (&d1._base);
someFunction (&d2._base);
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp0eXBlZGVmIHN0cnVjdCB7CiAgaW50ICgqbXlGdW5jMSkgKCk7CiAgaW50ICgqbXlGdW5jMikgKCk7Cn0gVlRhYmxlOwoKdHlwZWRlZiBzdHJ1Y3QgewogIGNvbnN0IFZUYWJsZSogX3Z0YWJsZTsKICBpbnQgYSwgYjsKfSBCYXNlOwoKdHlwZWRlZiBzdHJ1Y3QgewogIEJhc2UgX2Jhc2U7Cn0gRGVyaXZlZDE7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgQmFzZSBfYmFzZTsKfSBEZXJpdmVkMjsKCmludCBEZXJpdmVkMV9teUZ1bmMxICgpIHsKCXJldHVybiAxOwp9CgppbnQgRGVyaXZlZDFfbXlGdW5jMiAoKSB7CglyZXR1cm4gMjsKfQoKaW50IERlcml2ZWQyX215RnVuYzEgKCkgewoJcmV0dXJuIDM7Cn0KCmludCBEZXJpdmVkMl9teUZ1bmMyICgpIHsKCXJldHVybiA0Owp9CgoKY29uc3QgVlRhYmxlIHZ0YWJsZURlcml2ZWQxID0geyAmRGVyaXZlZDFfbXlGdW5jMSwgJkRlcml2ZWQxX215RnVuYzIgfTsKY29uc3QgVlRhYmxlIHZ0YWJsZURlcml2ZWQyID0geyAmRGVyaXZlZDJfbXlGdW5jMSwgJkRlcml2ZWQyX215RnVuYzIgfTsKCnZvaWQgRGVyaXZlZDFfQ29uc3RydWN0IChEZXJpdmVkMSogaW5zdGFuY2UpIHsKICBpbnN0YW5jZS0+X2Jhc2UuX3Z0YWJsZSA9ICZ2dGFibGVEZXJpdmVkMTsKfQoKdm9pZCBEZXJpdmVkMl9Db25zdHJ1Y3QgKERlcml2ZWQyKiBpbnN0YW5jZSkgewogIGluc3RhbmNlLT5fYmFzZS5fdnRhYmxlID0gJnZ0YWJsZURlcml2ZWQyOwp9CgovLy8gLS0tLS0KCnZvaWQgc29tZUZ1bmN0aW9uIChCYXNlKiBiYXNlKSB7CglpbnQgeCA9IChiYXNlLT5fdnRhYmxlLT5teUZ1bmMxKSAoKTsKCWludCB5ID0gKGJhc2UtPl92dGFibGUtPm15RnVuYzIpICgpOwoJCglwcmludGYgKCIlZFxuIiwgeCp5KTsKfQoKaW50IG1haW4gKCkgewoJRGVyaXZlZDEgZDE7CglEZXJpdmVkMV9Db25zdHJ1Y3QgKCZkMSk7CgoJRGVyaXZlZDIgZDI7CglEZXJpdmVkMl9Db25zdHJ1Y3QgKCZkMik7CgkKCXNvbWVGdW5jdGlvbiAoJmQxLl9iYXNlKTsKCXNvbWVGdW5jdGlvbiAoJmQyLl9iYXNlKTsKfQ==