home *** CD-ROM | disk | FTP | other *** search
- Newsgroups: comp.lang.c++
- Path: sparky!uunet!munnari.oz.au!spool.mu.edu!uwm.edu!linac!att!cbnewse!cbnewsd!att-out!walter!128.96.60.47!ik
- From: ik@puffin.ctt.bellcore.com (Ik Su Yoo )
- Subject: virtual multi-method in C++?
- Message-ID: <IK.93Jan27085949@puffin.ctt.bellcore.com>
- Sender: news@walter.bellcore.com
- Nntp-Posting-Host: 128.96.148.245
- Reply-To: Ik Su Yoo <ik@mobydick.leis.bellcore.com>
- Organization: Bell Communications Research
- Date: 27 Jan 93 08:59:49
- Lines: 44
-
-
- This has been bugging me for a long time and I was wondering if this is
- doable in C++. Here's the problem:
-
- Say I have a hierarchy of data structures rooted at class D, something
- like:
-
- class D {};
- class D1: public D {};
- class D2: public D {};
-
- And I want to build an editor for manipulating the data structures.
-
- Typically, the editor is sensitive to the type of the data that it is
- manipulating. For example, there may be a constraint that says a D2
- may be displayed inside a D1 but not vice versa. So, I (try to) express
- this constraint using virtual functions:
-
- virtual int D::canContain(const D&) = 0;
- virtual int D1::canContain(const D2&) { return 1; };
- virtual int D2::canContain(const D1&) { return 0; };
-
- But this does not work, since all these functions have different
- signatures. So, I expand it to:
-
- virtual int D::canContain(const D1&) { return 0; };
- virtual int D::canContain(const D2&) { return 0; };
- virtual int D::canContain(const D1&) { return 0; };
- virtual int D::canContain(const D2&) { return 0; };
-
- virtual int D1::canContain(const D2&) { return 1; };
-
- This is horrible, since D now has to be aware of all its derived classes.
- The reason why I want to make canContain() virtual is because I want to
- treat all objects uniformly as having type D*.
-
- I'm pretty sure this could be cleanly handled if C++ provided a virtual
- multi-method mechanism, but I don't think C++ does. Does anyone see a
- better way of doing something like this in C++?
- --
-
- Ik Su Yoo
- RRC-4F728, x5764
- ik@mobydick.leis.bellcore.com
-