C already has classes. They're called structs. And methods are called function pointers.
C already has classes. They're called structs. And methods are called function pointers.
My post was meant to be funny yet true. I read the OA and thought all of the ideas he listed already exist, and was surprised it made the front page on Hacker News. Then I thought to myself, "Oh, it must be because it's a joke, the OA was trying to be funny." Perhaps I was mistaken.
C has perfectly good inheritance:
struct child {
struct parent p;
// new variables go here
}
struct child foo;
struct parent * bar = &foo; // perfectly valid CIs my C that rusty?
For example, say that the "struct parent" type (which in your example has no members) had a member named z. In your example, I expect to be allowed to do something like this:
(*bar).p.z
which is composition. But not: (*bar).z
which would be member inheritance. Because bar/foo/child all lack a z member. Only "parent" has a z member. Am I wrong? struct child {
struct parent {
int z;
} p;
} foo;
you can access foo.p.z but not foo.z -- but you can access (struct parent *)(&foo)->z, so you can pass foo to anything which expects a struct parent. Child Struct:
+---------------+-----------------+
| parent struct | child fields |
+---------------+-----------------+
^
\--- pointers to the struct point at the start
You can cast this child struct to a parent struct, which is like saying 'interpret memory starting here as a 'parent' struct'.This works: The memory from location to location+sizeof(parent) IS a parent struct. The child fields following the parent struct are simply ignored.
Well... almost. C structs can have internal padding -- but the C standard doesn't allow padding before the first element, so that first element is guaranteed to begin at the beginning of the struct.
If you really want to know what OOP is / was / can be, read Cardelli and Abadi's A Theory of Objects. The first half is available online, and covers the parts you'd care about: http://books.google.com/books?id=4xT3LgCPP5UC