を使用して、私は次のクラスとオブジェクトがあるとします。動物は抽象クラスであることどのように適切に削除ポインタへの抽象クラスに
#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;
}
注意。
ポインタを正しく削除するにはanimal
、cat
、cow
?
私はdelete animal;
にしようとすると、私は次の警告メッセージが出ます:
警告: 非仮想デストラクタを持つ抽象クラスタイプ「動物」が削除対象が未定義の動作を引き起こします。一方で
私はdelete cat;
しようとすると、私は次のメッセージが出ます:
警告: 非仮想デストラクタを持つポリモーフィッククラスタイプ「猫」が削除対象が未定義の動作を引き起こす可能性があります。
警告として「Animal」デストラクタを 'virtual'にします。 – user0042