Я видел, что это сделано раньше.
#include "stdio.h"
#define FRUIT_COLOR_RED 1
struct fruit {
char* name;
};
struct apple {
struct fruit base;
int color;
};
void printFruit(struct fruit *f) {
printf(f->name);
}
int main(int argc, char** argv) {
struct apple a;
a.base.name = "apple";
a.color = FRUIT_COLOR_RED;
printFruit((struct fruit*)&a);
return 0;
}
Это работает, потому что struct fruit является первым членом struct apple и две структуры выровнены в памяти.
| - 4 или 8 bytes (char *) - | => struct fruit in memory
| - 4 или 8 байтов (char *) - | - 4 или 8 байтов (int) - | => struct apple in memory
Первые 4 или 8 байтов (в зависимости от 32-битного и 64-битного соответственно) имеют одинаковую длину и тип, поэтому вы можете сбрасывать структурное яблоко * на struct fruit * и потому, что они выстраиваются в линию в памяти он читает членов структурных плодов.
Я не знаю, является ли это хорошей практикой, и я бы избегал этого. Мне нравится простота C, но почему бы не использовать язык, на котором построены такие конструкторы, такие как C++.
Слишком реалистичные функции ориентации объектов в C означают больше строк кода и больше обслуживания.
Также, если код не строится, я написал его сейчас в блокноте, но концепция есть. На данный момент у меня нет компилятора C :-(.
Вы спрашиваете о [что-то вроде этого] (http://stackoverflow.com/q/3322650/2065121)? –
Конечно, возможно реализовать множественное наследование в C. Фактически, самый первый компилятор C++ создал C-код, который был скомпилирован обычным компилятором C. Это не так просто. –
C structs не являются «классами» в смысле ООП. поля данных, «классы» ООП также должны иметь методы и наследование. Вы * можете * реализовать практически что-либо в C, включая любой механизм ООП, но вы должны сделать это сами, в коде компилятор не сделает этого для вас, поэтому результат будет многословным и беспорядочным. – hyde