Re: dynamic_cast and accessible base classes.
On Apr 24, 3:03 pm, Paul Bibbings <paul.bibbi...@googlemail.com>
wrote:
In ?15.4.1, "Dynamic_cast," of Stroustrup's TC++PL (Sp. Ed. 2000, 2nd
printing, p. 408), the author gives the following as an illustration
of the application of dynamic_cast, using:
dynamic_cast<T*>(p);
saying "if p is of type T* or an accessible base class of T, the
result is exactly as if we had simply assigned p to a T*." He then
goes on to give an example where the base class in inaccessible
(protected):
class BB_ival_slider
: public Ival_slider, protected BBslider { /* ... */ };
void f(BB_ival_slider* p) {
// <snip>
BBslider* pbb1 = p; // error: BBslider is a protected base
BBslider* pbb2 = dynamic_cast<BBslider*>(p); // ok: pbb2 = 0
}
However, when I attempt to convert this into a brief working example,
as for instance here...
#include <iostream>
class A {
public:
virtual void do_stuff() = 0;
};
class B : protected A {
public:
void do_stuff() { }
};
int main()
{
B *b = new B();
A *a = dynamic_cast<A *>(b); // line 17
if (!a) {
std::cout << "A *a = 0\n";
}
delete b;
return 0;
}
... I get errors that suggest that the dynamic cast, in this
instance, is no more allowed than the attempt at direct
assignement is for the compilers that I have access to.
Only VC++, being lax, provides a warning where the others produced an
error...
Is it possible that I have "lost something in translation" in
my example above?
I don't see anything wrong in your example, nor do I see anything in
the Standard prohibiting using dynamic_cast to cast to a non-public
base (of course, the result is then 0, as the cast fails at run-time).
In fact, it even has an example for such a case, along the lines of
Stroustroup's one, with comment "fails" rather than "ill-formed" - the
former means that result should be 0, the latter means that it
shouldn't compile.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]