Pete Becker
10/28/2008 10:32:00 AM
On 2008-10-27 22:08:09 -0400, "Ross A. Finlayson"
<raf@tiki-lounge.com.invalid> said:
> Pete Becker wrote:
>> On 2008-10-27 18:08:43 -0400, Rocketmagnet <hugo.elias@virgin.net> said:
>>
>>> Hi all,
>>>
>>> I have been kind of forced (honestly) into writing a class structure
>>> which contains a Diamond of Death, and I'm not entirely sure what to
>>> do about it.
>>
>> I don't understand. Having a common virtual base class is sometimes an
>> appropriate design. Why do you call it a "Diamond of Death"?
>>
>>> This is a simplified version of my class structure:
>>
>> Simplified to the point of incorrectness, since the code in main
>> (that's what _tmain means, right?) refers to ENTITY but the nearest
>> thing here is entity.
>>
>>>
>>>
>>> class entity
>>> {
>>> public:
>>> entity() {}
>>>
>>> int a;
>>> };
>>>
>>>
>>> class item : public entity
>>> {
>>> public:
>>> item() {}
>>>
>>> int b;
>>> };
>>>
>>>
>>> class loop : public virtual item
>>> {
>>> public:
>>> loop() {}
>>>
>>> int c;
>>> };
>>>
>>>
>>> class path : public virtual item
>>> {
>>> public:
>>> path() {}
>>>
>>> int d;
>>> };
>>>
>>> class test : public path, public loop
>>> {
>>> public:
>>> test() {}
>>>
>>> int e;
>>> };
>>>
>>>
>>>
>>> int _tmain(int argc, _TCHAR* argv[])
>>> {
>>> ENTITY *entity_test = new test();
>>> ENTITY *entity_loop = new loop();
>>>
>>> loop* l = (loop*)entity_loop; // cannot convert a 'ENTITY*' to a
>>> 'loop*'
>>> // conversion from a virtual base
>>> class is implied
>>
>> You need to use dynamic_cast here, and in order to do that, ENTITY or
>> entity, whichever is the real class, needs to have at least one virtual
>> function.
>>
>
> There are different ways to do it, C++ has a way, without resorting to
> lower level languages with the platform runtime.
>
> It is in the C++ FAQ how to deal with the dreaded diamond, I suggest
> you read it.
Thanks for the pointer, but I'm quite familiar with virtual inheritance.
--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)