2013-12-20 6 views
-1

Я видел, что мы можем реализовать множественное наследование в ANSI C? Как мы можем создать любой класс какМожем ли мы реализовать наследование в C

struct sampleClass { 
    int size; 
    struct sampleClass *ptr1; 
}; 

Как я тред создать класс и хочу реализовать наследование. Можете ли вы дать мне представление о том, как это реализовать?

+2

Вы спрашиваете о [что-то вроде этого] (http://stackoverflow.com/q/3322650/2065121)? –

+0

Конечно, возможно реализовать множественное наследование в C. Фактически, самый первый компилятор C++ создал C-код, который был скомпилирован обычным компилятором C. Это не так просто. –

+0

C structs не являются «классами» в смысле ООП. поля данных, «классы» ООП также должны иметь методы и наследование. Вы * можете * реализовать практически что-либо в C, включая любой механизм ООП, но вы должны сделать это сами, в коде компилятор не сделает этого для вас, поэтому результат будет многословным и беспорядочным. – hyde

ответ

1

Я видел, что это сделано раньше.

#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 :-(.

3

Это зависит от того, что вы подразумеваете под «внедрением inheritance в C».

Это было сделано с помощью макросов, правил и стилей кодирования и struct указателей функций (имитация virtual method table) и других metadata. Хороший пример - GTK с его слоем GObject.

Смежные вопросы