Re: Dealing with a Diamond of Death
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.
--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)