
Originally Posted by
jml
That begs the question as to why some classes, such as
QTextEdit,
do have virutual destructors.
Example:
class Foo
{
public:
Foo()
virtual ~Foo();
};
class Bar : public Foo
{
public:
Bar();
~Bar();
};
class SubBar : public Bar
{
public:
SubBar()
~SubBar();
};
Foo *f1 = new Bar();
Bar *b1 = new subBar();
class Foo
{
public:
Foo()
virtual ~Foo();
};
class Bar : public Foo
{
public:
Bar();
~Bar();
};
class SubBar : public Bar
{
public:
SubBar()
~SubBar();
};
Foo *f1 = new Bar();
Bar *b1 = new subBar();
To copy to clipboard, switch view to plain text mode
Now when b1 is deleted, Bar's destructor is invoked since Foo's destructor is virtual. However when b1 is deleted, SubBar's destructor is
NOT invoked, since Bar's destructor is not virtual. This strikes me as a problem.
Did you try the example you gave here ? Just put some cout/qDebugs and you will be able to confirm that deleting b1 calls destructor of SubBar.
~Bar is virtual since it inherits Foo which has virtual destructor.
EDIT:
Just for your info
#include <iostream>
using namespace std;
class Foo
{
public:
Foo() { cout << "Foo" << endl; }
virtual ~Foo() { cout << "~Foo" << endl; }
};
class Bar : public Foo
{
public:
Bar() { cout << "Bar" << endl; }
~Bar() { cout << "~Bar" << endl; }
};
class SubBar : public Bar
{
public:
SubBar() { cout << "SubBar" << endl; }
~SubBar() { cout << "~SubBar" << endl; }
};
int main()
{
Foo *f1 = new Bar();
Bar *b1 = new SubBar();
delete b1;
return 0;
}
#include <iostream>
using namespace std;
class Foo
{
public:
Foo() { cout << "Foo" << endl; }
virtual ~Foo() { cout << "~Foo" << endl; }
};
class Bar : public Foo
{
public:
Bar() { cout << "Bar" << endl; }
~Bar() { cout << "~Bar" << endl; }
};
class SubBar : public Bar
{
public:
SubBar() { cout << "SubBar" << endl; }
~SubBar() { cout << "~SubBar" << endl; }
};
int main()
{
Foo *f1 = new Bar();
Bar *b1 = new SubBar();
delete b1;
return 0;
}
To copy to clipboard, switch view to plain text mode
Output
Foo
Bar
Foo
Bar
SubBar
~SubBar
~Bar
~Foo
Bookmarks