Witam
Czy poniższa implementacja vtable w C jest wyczerpująca? Bazowałem na 4 różnych artykułach z google ale nie wiem czy do końca wyczerpany jest temat. Głównie chodzi mi o to czy na końcu w funkcji main nie da się czegoś prostszego zaiplementować, bo mam np.:
A.vptr->metoda(&A);
B.base.vptr->metoda((Klasa*)&B);
a może coś da się dodać do implementacji vtable, że te wywołania będą w stylu:
A.metoda(); //metoda z klasy bazowej
B.metoda(); //metoda z klasy pochodnej
Tutaj cały kod:
//Base class
struct vtableKlasa;
typedef struct Klasa
{
int a,b,c;
const vtableKlasa* vptr;
} Klasa;
void KlasaMetoda(Klasa* const my)
{
my->a = 10;
my->b = 11;
my->c = 12;
cout << "Method from base class" << endl;
}
typedef struct vtableKlasa
{
void(*metoda)(struct Klasa* const my);
} vtableKlasa;
static const vtableKlasa vTableFunc =
{
KlasaMetoda
};
void KlasaCtor(Klasa* const my)
{
my->a = 0;
my->b = 0;
my->c = 0;
my->vptr = &vTableFunc;
cout << std::hex << "Address of base class 0x" << my << endl;
}
//inherited class
struct vtableKlasaPoch;
typedef struct KlasaPoch
{
Klasa base;
int d;
} KlasaPoch;
void KlasaPochMetoda(struct Klasa* const my)
{
my->a = 10;
my->b = 11;
my->c = 12;
((KlasaPoch*)my)->d = 9;
cout << "Method from inherited class" << endl;
}
static const vtableKlasa vTableFuncPoch = { KlasaPochMetoda };
void KlasaPochCtor(KlasaPoch* const my)
{
KlasaCtor(&my->base);
my->d = 0;
my->base.vptr = &vTableFuncPoch;
cout << std::hex << "Address of inherited class 0x" << my << endl;
}
void main()
{
cout << "CTest(): " << endl;
Klasa A;
KlasaCtor(&A);
KlasaPoch B;
KlasaPochCtor(&B);
A.vptr->metoda(&A);
B.base.vptr->metoda((Klasa*)&B);
//Examples of usage
Klasa* C = (Klasa*)&B;
C->vptr->metoda(C);
KlasaPoch* D = &B;
D->base.vptr->metoda((Klasa*)D);
}
Temat to pod rozmowę kwalifikacyjną jak dadzą ci pytanie byś zaimplementował w C vtable, to się zastanawiam czy to powyżej wystarczy czy ktoś z rekrutujących poprosi o to by coś dodać aby wywołania były w stylu:
A.metoda(); //metoda z klasy bazowej
B.metoda(); //metoda z klasy pochodnej