Skip to content

Instantly share code, notes, and snippets.

@amullins83
Last active June 8, 2021 18:51
Show Gist options
  • Save amullins83/e8958d7d3b3bcb8a364c to your computer and use it in GitHub Desktop.
Save amullins83/e8958d7d3b3bcb8a364c to your computer and use it in GitHub Desktop.
Polymorphism in C

#Polymorphism in C

##Summary

C is the lengua franca of embedded development. It is incredibly flexible, with built-in language features for imperative, functional, and object-oriented programming. However, getting inheritance to work effectively in standard C requires a little boiler-plate code, of which I've provided an example here.

#include <stdlib.h>
#include "base.h"
Base *Base_New(void)
{
return (Base *)malloc(sizeof(Base));
}
void Base_Delete(Base *baseObject)
{
free(baseObject);
}
#ifndef BASE_H
#define BASE_H
typedef struct _BASE
{
int baseParameter;
} Base;
Base *Base_New(void);
void Base_Delete(Base *baseObject);
#endif
#include <stdio.h>
#include "sub_class.h"
int main()
{
Base *baseObject;
SubClass *subClassObject;
subClassObject = SubClass_New();
subClassObject->otherParameter = 5;
subClassObject->base->baseParameter = 3;
printf("The sub-class object's baseParameter value is %d\n", subClassObject->base->baseParameter);
baseObject = subClassObject->base;
printf("The baseParameter value after casting to the base class is %d\n", baseObject->baseParameter);
baseObject->baseParameter = 5;
printf("Updated baseParameter to %d\n", baseObject->baseParameter);
printf("The sub-class baseParameter value is now %d\n", subClassObject->base->baseParameter);
SubClass_Delete(subClassObject);
return 0;
}
build:
gcc -g -o obj/base.o -c base.c
gcc -g -o obj/sub_class.o -c sub_class.c
gcc -g -o obj/main.o -c main.c
gcc -g -o main.exe obj/main.o obj/sub_class.o obj/base.o
run: build
./main.exe
all: run
#include <stdlib.h>
#include "sub_class.h"
SubClass *SubClass_New(void)
{
Base *base = Base_New();
SubClass *sub = (SubClass *)malloc(sizeof(SubClass));
sub->base = base;
return sub;
}
void SubClass_Delete(SubClass *subClassObject)
{
Base_Delete(subClassObject->base);
free(subClassObject);
}
#ifndef SUB_CLASS_H
#define SUB_CLASS_H
#include "base.h"
typedef struct _SUB_CLASS
{
Base *base;
int otherParameter;
} SubClass;
SubClass *SubClass_New(void);
void SubClass_Delete(SubClass *subClassObject);
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment