On 27 Apr., 20:39, Free0...@[EMAIL PROTECTED]
wrote:
> if i make a class that inherit another class, when i delete the
> pointer casted to the inherited class, only the destructor of the
> inherited class fires, the base class does not.
>
> ex:
>
> class shape
> {
> ~shape()
> }
>
> class square : class shape
> {
> ~square()
> }
>
> square pSquare = new square();
>
> shape pShape = dynamic_cast<shape *>(pSquare);
>
> delete pShape; <== only calls ~shape()
Please ensure that code snippets are valid
C++, otherwise it's hard to distinguish what
your actual problem is. Let's first transform
this into syntactically valid C++ (Your comments
imply that your program compiles):
class shape
{
public:
~shape(){}
};
class square : public shape
{
public:
~square(){}
};
int main() {
square* pSquare = new square();
shape* pShape = dynamic_cast<shape *>(pSquare);
delete pShape; // <== only calls ~shape()
}
Anything might happen in the very last statement,
because you are in "Undefined Behavior" land (something
like Alice's Wonderland, but not so funny ;-)
The rule behind this is [expr.delete]/3:
"In the first alternative (delete object), if the static
type of the operand is different from its dynamic type,
the static type shall be a base class of the operand’s
dynamic type and the static type shall have a virtual
destructor or the behavior is undefined.[..]"
In other words: If you want to perform a polymorphic
delete, the base class destructor must be virtual:
class shape
{
public:
virtual ~shape(){}
};
HTH & Greetings from Bremen,
Daniel Krügler
--
[ See http://www.gotw.ca/resources/clcm.htm
for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]


|