struct and function-pointer casting

M

Maurice

Hi,

Is it legal to cast from void(*)(A*) to void(*)(B*)?
Is it legal to cast from struct Derived{Base b; ...} to struct Base?

I'm trying to get some inheritance and polymorphism in C
and I end up with the following code:

struct Base {
void(*func)(struct Base*);
};

struct Derived {
struct Base base;
/* ... */
};

void derived_func(struct Derived* d) {}

int main() {
struct Derived d = {{derived_func} /*...*/ };

struct Base* b = &d;
b->func(b);
}

Thank you.
 
E

Eric Sosman

Maurice said:
Hi,

Is it legal to cast from void(*)(A*) to void(*)(B*)?
Is it legal to cast from struct Derived{Base b; ...} to struct Base?

I'm trying to get some inheritance and polymorphism in C
and I end up with the following code:

struct Base {
void(*func)(struct Base*);
};

struct Derived {
struct Base base;
/* ... */
};

void derived_func(struct Derived* d) {}

int main() {
struct Derived d = {{derived_func} /*...*/ };

struct Base* b = &d;
b->func(b);
}

No; the type of `derived_func' does not match the
type of the `func' element in `struct Base', so the
compiler should object to the initialization. One
simple fix is

void derived_func(struct Base *b) {
struct Derived *d = (struct Derived*)b;
...
}

The conversions of the struct pointers are all right:
any struct pointer can be converted to and from a pointer
to the struct's first element (unless that element is a
bit-field; you can't point to a bit-field).
 
M

Maurice

Eric Sosman said:
No; the type of `derived_func' does not match the
type of the `func' element in `struct Base', so the
compiler should object to the initialization. One
simple fix is

void derived_func(struct Base *b) {
struct Derived *d = (struct Derived*)b;
...
}

Ok, not as neat as it would be in my code but I think I can
live with it.
The conversions of the struct pointers are all right:
any struct pointer can be converted to and from a pointer
to the struct's first element (unless that element is a
bit-field; you can't point to a bit-field).

That is good.

Thanks for your answer.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,010
Latest member
MerrillEic

Latest Threads

Top