Re: delete an inherited class
On 27 Apr., 20:39, Free0...@gmail.com 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! ]