Конечно
Есть же objective c
Есть же С++ :))
GObject
Да. GObject как вариант, но есть ещё COS.
вместо классов - структуры, вместо виртуальных функций - указатели на функции
https://github.com/CObjectSystem/COS
Вот так просто вместо вируальых функций - просто указатли на функции ? Указатели на функции просто заменят "методы" С++, а не вирутальные функции. Ну а уж что говорить про деструкторы и констуркторы.
а причем тут CLOS ?
ой извините, случайно прочитал CLOS, вместо COS
Lisp enjoyer detected.
можно в структуру, которая содержит данные объекта, добавлять указатели на функции. Получается, для вызывающего кода будет единый интерфейс вызова, а нужная функция будет подставляться во время инициализации (можно сказать, что в конструкторе)
Виртуалные функции в С++ - это метод полиморфизма. Вы тоже можете создать разные классы с одинаковым методом - НО это не будет виртуальная функция, так как Классы имеют разный ТИП.
я как раз про реализацию полиморфизма и говорю. Указатель нужен, чтобы менять его в потомках
Я вот как раз не вижу в ваших словах - пример реализации полиморфизма.
#include <stdio.h> typedef struct Base { void (*print)(const char* s); } Base; static void BasePrint(const char* s) { printf("Base: %s\n", s); } Base constructBase() { return (Base){ .print = BasePrint }; } typedef struct A { struct Base B; } A; static void APrint(const char* s) { printf("A: %s\n", s); } A constructA() { return (A){ .B.print = APrint }; } void main() { A a = constructA(); a.B.print("ggg"); } результат $ gcc 1.c $ ./a.out A: ggg $
самый наверно яркий пример полиморфизма - это возможность в Linux читать из файла системным вызовом read независимо от того, как устроен сам файл. А ядро Linux написано на C
Причем тут read и полиморфизм. Мне кажется ты не понимаешь, что такое полиморфизм или я. Мы это выясним, если ты сделаешь то, что я попросил выше. Сделай пожалуйста то, что я попросил выше
#include <stdio.h> typedef struct Base { void (*print)(const char* s); } Base; static void BasePrint(const char* s) { printf("Base: %s\n", s); } Base constructBase() { return (Base){ .print = BasePrint }; } typedef struct A { struct Base B; } A; static void APrint(const char* s) { printf("A: %s\n", s); } A constructA() { return (A){ .B.print = APrint }; } void callPrintUsingPoiner(Base* b) { b->print("ggg"); } void main() { A a = constructA(); Base b = constructBase(); callPrintUsingPoiner(&a.B); callPrintUsingPoiner(&b); } результат $ ./a.out A: ggg Base: ggg $
А теперь сделай пожалуйста следующее: Base* Base_pointer; Base_pointer = (Base* )malloc[2]; А теперь дабавь в первый элемент тип struct A, а во второй элементы тип struct B и вызови одинаковые метод у этих двух стурктур. А ТОЧНЕЕ - ЭТИ ДВУХ СТРУКТУР УЖЕ НЕТ - ТАК КАК ЕСТЬ ЕДИНЫЙ БАЗОВЫЙ КЛАСС, вот после доавбления в условный единый контенейр твоих двух стурктур и вызвови методы этих стурктур, как метод БАЗВОГО КЛАССА.
#include <stdio.h> #include <stdlib.h> typedef struct Base { void (*print)(const char* s); } Base; static void BasePrint(const char* s) { printf("Base: %s\n", s); } Base constructBase() { return (Base){ .print = BasePrint }; } typedef struct A { struct Base B; } A; static void APrint(const char* s) { printf("A: %s\n", s); } A constructA() { return (A){ .B.print = APrint }; } void main() { A a = constructA(); Base b = constructBase(); Base** m = malloc(sizeof(*m) * 2); m[0] = (Base*)&a; m[1] = &b; m[0]->print("ggg"); m[1]->print("ggg"); } результат тот же A: ggg Base: ggg
Не смущает, что подобный каст это уб?))
Обсуждают сегодня