this is my first question in stackowerflow. So i'm excited :) I am trying to practice polymorphism in C. I have read many articles. I wrote a small sample code with what I understood. my goal is to create one shape class. this class includes field and length methods. The rectangle and circle classes that derive from this class make their own calculation of the field and length methods.
But there is a problem during compilation: enter image description here Exception thrown at 0x000000000000000A in OOP_in_C_example_3_polymorphism_3.exe: 0xC0000005: Access violation executing location 0x000000000000000A.
it gets better when I delete one of the lines. but this time it operates according to the last called constructor: enter image description here
Where am I having problems?
shape.h:
#include <stdint.h>
struct Vtable;
typedef struct{
struct Vtable* vptr;
uint16_t x;
uint16_t y;
}Shape;
struct Vtable {
void(*area)(Shape* me);
void(*lenght)(Shape* me);
};
inline void area(Shape* me) {
(*me->vptr->area)(me);
}
inline void lenght(Shape* me) {
(*me->vptr->lenght)(me);
}
void shape_ctor(Shape* me, int x, int y);
shape.c:
#include "shape.h"
void shape_ctor(Shape* me,int x, int y) {
struct Vtable vtbl = { &area,&lenght };
me->vptr = &vtbl;
me->x = x;
me->y = y;
}
rect.h:
#include "shape.h"
typedef struct {
Shape super;
uint16_t en;
uint16_t boy;
}rect;
void rect_ctor(rect* me, uint16_t x, uint16_t y, uint16_t en, uint16_t boy);
rect.c:
#include "rect.h"
#include <stdio.h>
void rect_lenght(void* me);
void rect_area(void* me);
void rect_ctor(rect* me,uint16_t x, uint16_t y, uint16_t en, uint16_t boy) {
struct Vtable vtbl = { &rect_area, &rect_lenght };
shape_ctor(&me->super, x, y);
me->super.vptr = &vtbl; //override vptr
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));
}
circle.h:
#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);
circle.c:
#include "circle.h"
#include <stdio.h>
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));
}
main.c:
#include <stdio.h>
#include "rect.h"
#include "circle.h"
int main() {
rect k1;
circle d1;
rect_ctor(&k1, 10, 10, 15, 20);
circle_ctor(&d1, 10, 10, 5);
k1.super.vptr->lenght(&k1);
d1.super.vptr->lenght(&d1);
}