home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #3 / NN_1993_3.iso / spool / comp / lang / cplus / 20024 < prev    next >
Encoding:
Text File  |  1993-01-28  |  2.0 KB  |  57 lines

  1. Newsgroups: comp.lang.c++
  2. Path: sparky!uunet!munnari.oz.au!spool.mu.edu!uwm.edu!linac!att!cbnewse!cbnewsd!att-out!walter!128.96.60.47!ik
  3. From: ik@puffin.ctt.bellcore.com (Ik Su Yoo )
  4. Subject: virtual multi-method in C++?
  5. Message-ID: <IK.93Jan27085949@puffin.ctt.bellcore.com>
  6. Sender: news@walter.bellcore.com
  7. Nntp-Posting-Host: 128.96.148.245
  8. Reply-To: Ik Su Yoo <ik@mobydick.leis.bellcore.com>
  9. Organization: Bell Communications Research
  10. Date: 27 Jan 93 08:59:49
  11. Lines: 44
  12.  
  13.  
  14. This has been bugging me for a long time and I was wondering if this is
  15. doable in C++. Here's the problem:
  16.  
  17. Say I have a hierarchy of data structures rooted at class D, something
  18. like:
  19.     
  20.   class D {};
  21.   class D1: public D {};
  22.   class D2: public D {};
  23.  
  24. And I want to build an editor for manipulating the data structures.
  25.  
  26. Typically, the editor is sensitive to the type of the data that it is
  27. manipulating. For example, there may be a constraint that says a D2
  28. may be displayed inside a D1 but not vice versa. So, I (try to) express
  29. this constraint using virtual functions:
  30.  
  31.   virtual int D::canContain(const D&) = 0;
  32.   virtual int D1::canContain(const D2&) { return 1; };
  33.   virtual int D2::canContain(const D1&) { return 0; };
  34.  
  35. But this does not work, since all these functions have different
  36. signatures. So, I expand it to:
  37.  
  38.   virtual int D::canContain(const D1&) { return 0; };
  39.   virtual int D::canContain(const D2&) { return 0; };
  40.   virtual int D::canContain(const D1&) { return 0; };
  41.   virtual int D::canContain(const D2&) { return 0; };
  42.  
  43.   virtual int D1::canContain(const D2&) { return 1; };
  44.  
  45. This is horrible, since D now has to be aware of all its derived classes.
  46. The reason why I want to make canContain() virtual is because I want to
  47. treat all objects uniformly as having type D*.
  48.  
  49. I'm pretty sure this could be cleanly handled if C++ provided a virtual
  50. multi-method mechanism, but I don't think C++ does. Does anyone see a
  51. better way of doing something like this in C++?
  52. --
  53.  
  54. Ik Su Yoo
  55. RRC-4F728, x5764
  56. ik@mobydick.leis.bellcore.com
  57.