This is C++ by the way, not some "Arduino language".
If you plan to use a destructor to clean up then the destructors must be virtual, including the base class.
Modified example:
class animal
{
public:
virtual void loop () = 0;
virtual ~animal () { Serial.println ("animal destructor."); }
};
class Tiger : public animal
{
public:
void loop () { Serial.println ("Tiger."); }
virtual ~Tiger () { Serial.println ("Tiger destructor."); }
};
class Dog : public animal
{
public:
void loop () { Serial.println ("Dog."); }
virtual ~Dog () { Serial.println ("Dog destructor."); }
};
class Penguin : public animal
{
public:
void loop () { Serial.println ("Penguin."); }
virtual ~Penguin () { Serial.println ("Penguin destructor."); }
};
animal * objArray [3];
void setup ()
{
Serial.begin (115200);
Serial.println ();
objArray [0] = new Tiger;
objArray [1] = new Dog;
objArray [2] = new Penguin;
for (int i = 0; i < 3; i++)
objArray [i]->loop ();
Serial.println ("Deleting objects ...");
for (int i = 0; i < 3; i++)
delete objArray [i];
} // end of setup
void loop () { }
Output:
Tiger.
Dog.
Penguin.
Deleting objects ...
Tiger destructor.
animal destructor.
Dog destructor.
animal destructor.
Penguin destructor.
animal destructor.
Be warned that there is a problem with free (and hence delete) in versions of the IDE up to 1.0.3.
You may need to install the fix described here:
Fixing String Crashes