Ich habe diesen Testcode geschrieben, der drei Typen verwendet: struct One
ist ein normaler Typ ohne virtuelle Mitglieder, struct Two : One
hat eine rein virtuelle Funktion und einen virtuellen Destruktor, und struct Three : Two
implementiert Two
Schnittstelle.
#include <iostream>
struct One
{
~One() {
std::cout << "~One()\n";
}
};
struct Two : One
{
virtual ~Two() {
std::cout << "~Two()\n";
}
virtual void test() = 0;
};
struct Three : Two
{
virtual ~Three() {
std::cout << "~Three()\n";
}
virtual void test() {
std::cout << "Three::test()\n";
}
};
int main()
{
Two* two = new Three;
two->test();
One* one = two;
delete one;
}
Das ist nicht überraschend, war die Ausgabe dies:
Drei::test()
~One()
Gibt es eine andere Möglichkeit, dies zu beheben, als jeden Destruktor virtuell zu machen? Oder sollten Programmierer einfach vorsichtig sein, um nicht in diese Situation zu geraten? Ich finde es seltsam, dass es keine Warnung beim Kompilieren gibt.