Angenommen, ich habe die folgenden Klassen und Objekte:Wie man richtig Zeiger löschen, wenn abstrakte Klassen mit
#include <iostream>
class Animal
{
public:
virtual void makeNoise() = 0;
void eat()
{
std::cout << "Eating..." << "\n";
}
void sleep()
{
std::cout << "Sleeping..." << "\n";
}
};
class Cat: public Animal
{
public:
void makeNoise()
{
std::cout << "Miow..." << "\n";
}
};
class Cow: public Animal
{
public:
void makeNoise()
{
std::cout << "Mooo..." << "\n";
}
};
int main()
{
Animal *animal;
Cat *cat = new Cat();
Cow *cow = new Cow();
animal = cat;
animal->eat();
animal->sleep();
animal->makeNoise();
animal = cow;
animal->eat();
animal->sleep();
animal->makeNoise();
return 0;
}
Beachten Sie, dass Tier eine abstrakte Klasse ist. Wie kann ich die Zeiger animal
, cat
und cow
richtig löschen?
Als ich delete animal;
versuchen erhalte ich die folgende Warnmeldung:
Warnung: Löschen Objekt der abstrakten Klassentyp ‚Animal‘, die nicht-virtuellen Destruktor nicht definiertes Verhalten verursacht hat.
In der anderen Hand, wenn ich zu delete cat;
versuchen erhalte ich die folgende Meldung:
Warnung: Löschen von Objekt polymorphen Klassentypen ‚Cat‘, die nicht-virtuellen Destruktor hat möglicherweise nicht definiertes Verhalten verursachen .
Tun Sie wie die Warnung sagt und machen Sie den 'Animal' Destruktor' virtual'. – user0042