struct Vtable; //deklarasyon yaptık.
typedef struct{ //Şekil Super Class'ı
struct Vtable const* vptr; //"Vtable" türünden pointer tanımladık. Override ederken kullanacağız
uint16_t x;
uint16_t y;
}Shape;
struct Vtable { //Alt sınıflardaki ortak metotlar. Fonksiyon pointer olarak Vtable yapısında tanımlanır.
void(*area)(Shape const* const me);
void(*lenght)(Shape const* const me);
};
void shape_ctor(Shape* me, int x, int y);
void shape_ctor(Shape* me,int x, int y) { //constructor metotu. ilk değerleri veriyoruz.
me->x = x;
me->y = y;
}
#include "shape.h"
typedef struct {
Shape super; //Super Class'tan miras almamızı sağlıyor.
uint16_t en;
uint16_t boy; //rect sınıfının kendine ait özellikleri
}rect;
void rect_ctor(rect* me, uint16_t x, uint16_t y, uint16_t en, uint16_t boy);
void rect_lenght(void* me);
void rect_area(void* me); //private olması için burda tanımladık
//constructor
void rect_ctor(rect* me,uint16_t x, uint16_t y, uint16_t en, uint16_t boy) {
//burada rect'a ait metotlar vtbl'ye verildi.
struct Vtable vtbl = { &rect_area, &rect_lenght };
shape_ctor(&me->super, x, y);
me->super.vptr = &vtbl; //override vptr. area ve lenght metotları rect'e ait metotlara işaret ediyor.
me->en = en;
me->boy = boy;
}
void rect_lenght(void* me) {
rect* me_ = (rect*)me; //downcast işlemi
printf("rectangle lenght: %d\n",(me_->en + me_->boy) * 2);
}
void rect_area(void* me) {
rect* me_ = (rect*)me; //downcast işlemi
printf("rectangle area: %d\n", (me_->en)*(me_->boy));
}
#include "shape.h"
typedef struct {
Shape super;
uint16_t radius;
}circle;
void circle_ctor(circle* me, uint16_t x, uint16_t y, uint16_t r);
void circle_lenght(void* me);
void circle_area(void* me);
void circle_ctor(circle* me, uint16_t x, uint16_t y, uint16_t r) {
struct Vtable vtbl = {&circle_area,&circle_lenght};
shape_ctor(&me->super, x, y);
me->super.vptr = &vtbl;
me->radius = r;
}
void circle_lenght(void* me) {
circle* me_ = (circle*)me;
printf("circle lenght: %f\n", (me_->radius) * (2) * (3.14));
}
void circle_area(void* me){
circle* me_ = (circle*)me;
printf("circle area: %f\n", (me_->radius) * (me_->radius) * (3.14));
}
#include <stdio.h>
#include "rect.h"
#include "circle.h"
int main() {
rect k1;
circle d1; //nesneleri oluşturduk.
rect_ctor(&k1, 10, 10, 15, 20);
circle_ctor(&d1, 10, 10, 5); //ilk değerler verildi ve her nesne artık kendine ait
//"area" ve "lenght" metotuna işaret ediyor.
k1.super.vptr->area(&k1);
d1.super.vptr->area(&d1);
//iki nesne de aynı metotu çağırdı ama ikisi için farklı hesaplama yapılacak.
}
Teşekkür ederim. Size de iyi çalışmalar.Kodları detaylı incelemeye vaktim olmadı. Ancak sorunuzun cevabını bu şekilde bulabilirsiniz.
“One Definition Rule”
İyi çalışmalar.