Skip to content

Commit 8766f6c

Browse files
author
Christian Howe
committed
Added virtual destructors
1 parent 8f0058f commit 8766f6c

File tree

4 files changed

+14
-1
lines changed

4 files changed

+14
-1
lines changed

Diff for: animal.c

+5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ int animal_new(animal_t* self, const char* type, const char* name) {
1010
}
1111

1212
self->vtable.speak = NULL;
13+
self->vtable.delete = NULL;
1314

1415
self->name = malloc(strlen(name)+1);
1516
strcpy(self->name, name);
@@ -24,6 +25,10 @@ int animal_new(animal_t* self, const char* type, const char* name) {
2425
}
2526

2627
int animal_delete(animal_t* self) {
28+
if (self->vtable.delete != NULL) {
29+
return self->vtable.delete(self);
30+
}
31+
2732
if (self->name != NULL) {
2833
free(self->name);
2934
self->name = NULL;

Diff for: animal.h

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
typedef struct {
1111
struct {
1212
void (*speak)(void* self);
13+
int (*delete)(void* self);
1314
} vtable;
1415

1516
void* private;

Diff for: dog.c

+7
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ void dog_speak (void* _self) {
1010
printf("'woof!' says the %s %s dog!\n", Dog.getSize(self), Dog.getFurColor(self));
1111
}
1212

13+
int dog_parent_delete(void* _self) {
14+
dog_t* self = _self;
15+
self->super.vtable.delete = NULL;
16+
Dog.delete(self);
17+
}
18+
1319
int dog_new (dog_t* self, const char* name, const char* furColor, const char* size) {
1420
if (furColor == NULL || size == NULL) {
1521
return ERROR_VAL;
@@ -18,6 +24,7 @@ int dog_new (dog_t* self, const char* name, const char* furColor, const char* si
1824
Animal.new(&(self->super), "dog", name);
1925

2026
self->super.vtable.speak = &dog_speak;
27+
self->super.vtable.delete = &dog_parent_delete;
2128

2229
self->private = malloc(sizeof(dog_p));
2330
dog_p* private = self->private;

Diff for: main.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ int main (int argc, char* argv[]) {
1717

1818
Animal.delete(&cat);
1919

20-
Dog.delete(dog);
20+
Animal.delete((animal_t*)dog);
2121
free(dog);
2222

2323
return 0;

0 commit comments

Comments
 (0)