Re: I don't get it
This is a multi-part message in MIME format.
--------------060609030809060902050501
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
Andre Kostur wrote:
Jo <jo.langie@telenet.be> wrote in
news:faBdi.21838$nN5.1513633@phobos.telenet-ops.be:
John Harrison wrote:
Jo wrote:
[snip]
Perhaps you are expecting an ordinary cast to work like a
dynamic_cast? When you write
bp2=(B*)p; // resulting bp2 is WRONG!
you are expecting the program to 'discover' that there a B object
hidden inside the object that p is pointing to?
If so google for dynamic_cast, or better still read a good book.
I understand that a dynamic_cast cannot do a base-to-derived
conversion, so that's not the solution here.
No, that's exactly what dynamic_cast is for, _if_ the pointer is pointing
to an object that actually is of the derived type.
And a static_cast doesn't seem to make any difference, because i'm
already doing static casts right, just in the 'old' way.
So i'm still looking for the solution for this situation
class A {
public:
virtual long GetClassID() { return(' A'); }
};
class B {
public:
// some class data & funx
};
class C : public class A, public class B {
public:
virtual long GetClassID() { return(' C'); }
};
foo1(C *cp) {
...
foo2(cp);
...
}
foo2(A *ap) {
if (ap->GetClassID==' C') {
C *cp=(C*)ap; // IS THIS LEGAL and PORTABLE C++
?
}
}
In theory that would work... of course so would:
class A {
virtual ~A() {};
};
class B {
virtual ~B() {};
};
class C : public class A, public class B {
virtual ~C() {};
void cfn() {};
};
foo1(C *cp) {
fooA(cp);
}
fooA(A *ap) {
C * cp = dynamic_cast<C*>(ap);
if (cp != NULL) {
cp->cfn();
}
}
No "getclassid" function required.
Indeed.
But i prefer not to use RTTI for the reasons mentioned in the earlier post.
However, note that there's no mention
of B anywhere in there (other than the inheritance).... so how does B
get involved in this question?
I guess i was confused:
Because i ran into the casting problem (due to the use of the void*), i
started thinking that it had to do with the multiple inheritance...
I really didn't know that using a void* abandons all the class relation
info. (and that after all these years of programming, damn damn damn)
Thanks a lot for your help!
A dummy got a bit less dummy :)
--------------060609030809060902050501
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1">
<title></title>
</head>
<body text="#000000" bgcolor="#ffffff">
<br>
Andre Kostur wrote:<br>
<blockquote type="cite"
cite="midXns99538A2AA71CCnntpspamkosutrnet@209.135.99.21">
<pre wrap="">Jo <a class="moz-txt-link-rfc2396E" href="mailto:jo.langie@telenet.be"><jo.langie@telenet.be></a> wrote in
<a class="moz-txt-link-freetext" href="news:faBdi.21838$nN5.1513633@phobos.telenet-ops.be:">news:faBdi.21838$nN5.1513633@phobos.telenet-ops.be:</a>
</pre>
<blockquote type="cite">
<pre wrap="">John Harrison wrote:
</pre>
<blockquote type="cite">
<pre wrap="">Jo wrote:
</pre>
</blockquote>
</blockquote>
<pre wrap=""><!---->
[snip]
</pre>
<blockquote type="cite">
<blockquote type="cite">
<pre wrap="">Perhaps you are expecting an ordinary cast to work like a
dynamic_cast? When you write
bp2=(B*)p; // resulting bp2 is WRONG!
you are expecting the program to 'discover' that there a B object
hidden inside the object that p is pointing to?
If so google for dynamic_cast, or better still read a good book.
</pre>
</blockquote>
<pre wrap="">
I understand that a dynamic_cast cannot do a base-to-derived
conversion, so that's not the solution here.
</pre>
</blockquote>
<pre wrap=""><!---->
No, that's exactly what dynamic_cast is for, _if_ the pointer is pointing
to an object that actually is of the derived type.
</pre>
<blockquote type="cite">
<pre wrap="">And a static_cast doesn't seem to make any difference, because i'm
already doing static casts right, just in the 'old' way.
So i'm still looking for the solution for this situation
class A {
public:
virtual long GetClassID() { return(' A'); }
};
class B {
public:
// some class data & funx
};
class C : public class A, public class B {
public:
virtual long GetClassID() { return(' C'); }
};
foo1(C *cp) {
...
foo2(cp);
...
}
foo2(A *ap) {
if (ap->GetClassID==' C') {
C *cp=(C*)ap; // IS THIS LEGAL and PORTABLE C++
?
}
}
</pre>
</blockquote>
<pre wrap=""><!---->
In theory that would work... of course so would:
class A {
virtual ~A() {};
};
class B {
virtual ~B() {};
};
class C : public class A, public class B {
virtual ~C() {};
void cfn() {};
};
foo1(C *cp) {
fooA(cp);
}
fooA(A *ap) {
C * cp = dynamic_cast<C*>(ap);
if (cp != NULL) {
cp->cfn();
}
}
No "getclassid" function required. </pre>
</blockquote>
<br>
<tt>Indeed.<br>
<br>
But i prefer not to use RTTI for the reasons mentioned in the earlier
post.<br>
<br>
</tt>
<blockquote type="cite"
cite="midXns99538A2AA71CCnntpspamkosutrnet@209.135.99.21">
<pre wrap="">However, note that there's no mention
of B anywhere in there (other than the inheritance).... so how does B
get involved in this question?</pre>
</blockquote>
<tt><br>
I guess i was confused: <br>
<br>
Because i ran into the casting problem (due to the use of the void*), i
started thinking that it had to do with the multiple inheritance...<br>
<br>
I really didn't know that using a void* abandons all the class relation
info. (and that after all these years of programming, damn damn damn)<br>
<br>
Thanks a lot for your help!<br>
<br>
A dummy got a bit less dummy :)<br>
</tt>
</body>
</html>
--------------060609030809060902050501--