Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Disagree C has classes. No "class" and no inheritance or polymorphism. C++ and Objective-C have these things. But I understand what you're saying. There is the very well-known structs+functions technique which gives a partial stand-in for full OO.

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.



Disagree C has classes. No "class" and no inheritance or polymorphism

C has perfectly good inheritance:

    struct child {
        struct parent p;
        // new variables go here
    }
    struct child foo;
    struct parent * bar = &foo;  // perfectly valid C


Looks like composition and a struct alias, not inheritance to me.

Is 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?


It's valid C to cast a structure to the type of its first element. So in the example of

  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.


I'll assume you're right. Thanks for pointing that out. Your C sounds fresher than mine. I used it heavily from 90-95 or so but later moved on to higher languages like Java and Python. If what you point out about the syntax is accurate, I find that to be a counter-intuitive design decision.


It works because C structs are just contiguous bits of memory, interpreted as various fields. A pointer to a struct points to the start of that contiguous bit of memory.

  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.


It works because C structs are just contiguous bits of memory, interpreted as various fields

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.


Thanks! You learn something every day :)


OOP != Class Inheritance


Ok, so what else is it? My understanding that the new Go language is not officially called object-oriented because it supports only interfaces and not inheritance or type hierarchy.


Go has true message passing, which is far more important to OOP than anything to do with data modeling, and Go's composition model for data is far more object-oriented than the usual Linnaean classicism. Pay attention to Alan Kay, not Stroustrup or Gosling.

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




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: