есть ли способ расширить эту структуру, как методы
перегрузка в яве или около того?
При перегрузке методов компилятор выбирает методы с одинаковыми именами, проверяя аргументы каждого вызова метода с таким именем. Обратите внимание, что это полностью локализованное решение: не учитывая вопросы оптимизации, выбор компилятора здесь влияет только на генерацию кода для одного оператора.
Где я все еще смогу использовать все операции
что у меня есть на моих более высоких структурах, имея новую структуру smallbox
с атрибутом цвета внутри вместо старого?
Я думаю, что вы ищете полиморфизм , а не перегрузка. Обратите внимание, что в Java (и C ++ и других известных мне языках, которые поддерживают это) это основано на отношении типа / подтипа между типами с разными именами. Я не знаю ни одного языка, который позволял бы вам переопределять имена типов и использовать два разных типа, как если бы они были одинаковыми в любом смысле. Конечно, С не делает.
Однако есть несколько альтернатив. Наиболее понятное согласование может включать создание нового структурного типа с другим именем, который содержит экземпляр старого:
struct sb {
int id;
int size;
};
struct sb_metered {
struct sb box;
int cost;
}
Функции, которые работают в отдельных экземплярах этих объектов по указателю , а не по значению, могут быть легко выполнены:
int get_size(struct sb *box) {
return sb->size;
}
int get_cost(struct sb_metered *metered_box) {
return metered_box->cost;
}
int main() {
struct sb_metered b = { { 1, 17}, 42 };
printf("id: %d, size: %d, cost: %d\n",
b.id,
get_size(&b.box),
get_cost(&b));
}
Обратите внимание, что это не позволяет вам формировать массивы супертипа (struct sb
), которые фактически содержат экземпляры подтипа, а также передавать или возвращать структурные объекты подтипа по значению, как если бы они были объекты супертипа.