2012-05-23 2 views
3

Можно создать дубликат:
How can I simulate OO-style polymorphism in C?C Союзы и полиморфизм

Я пытаюсь использовать союзы для создания полиморфизма в С. я делаю следующее.

typedef struct{ 
... 
... 
} A; 

typedef struct{ 
... 
... 
} B; 

typedef union{ 
     A a; 
     B b; 
}C; 

Мой вопрос: как я могу есть метод, который принимает тип C, но позволяет А и B также. Я хочу, чтобы следующее работы:

Если я определить функцию:

myMethod(C){ 
... 
} 

то, что я хочу, чтобы это работало:

main(){ 
A myA; 
myMethod(myA); 
} 

нет. Какие-либо предложения?

+3

Что это значит, что «это не работает» –

+0

Я получаю сообщение об ошибке «несовместимый тип для аргумента 1» – AFS

+0

Что вы собираетесь делать, как только вы его скомпилируете? Вы не можете определить, является ли это A или B. –

ответ

3

GNU и IBM поддерживают transparent_union расширение:

typedef union __attribute__((transparent_union)) { 
     A a; 
     B b; 
} C; 

, а затем вы можете использовать A с или B с или C s прозрачно:

A foo1; 
B foo2; 
C foo3; 
myMethod(foo1); 
myMethod(foo2); 
myMethod(foo3); 

См The transparent_union type attribute (C only).

+0

Большое спасибо. Последующий вопрос: хотя это сработало, оно не работает, когда я создаю массив: C [5] myArray; C [0] = a; Это не работает и требует явного литья. Есть ли способ обойти это? Благодаря! – AFS

+0

Действительно, это не так прозрачно, как вы думаете, правильное назначение было бы 'C [0] .a = a;' – hroptatyr

0

Вы должны использовать явное преобразование типов:

A myA; 
myMethod((C) myA); 
0

короткий ответ, что в C, вы не можете.

В C++ вы можете перегрузить myFunction() и предоставить несколько реализаций.

В C вы можете иметь только один myFunction(). Даже если вы могли бы объявить функцию так, чтобы она могла принимать A, B или C (например, void*), у нее не было бы возможности узнать, из каких из трех она была поставлена.

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