我有一个看似简单的问题,但无论如何我想了解答案。
示例代码如下。
#include <QtCore/QCoreApplication>
#include "parent.h"
#include "childa.h"
#include "childb.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Parent one;
ChildA two;
ChildB three;
return a.exec();
}
#ifndef CHILDA_H
#define CHILDA_H
#include <iostream>
#include "parent.h"
using namespace std;
class ChildA : public Parent
{
public:
ChildA();
~ChildA();
};
#endif // CHILDA_H
#ifndef CHILDB_H
#define CHILDB_H
#include <iostream>
#include "parent.h"
using namespace std;
class ChildB : public Parent
{
public:
ChildB();
~ChildB();
};
#endif // CHILDB_H
#ifndef PARENT_H
#define PARENT_H
#include <iostream>
using namespace std;
class Parent
{
public:
Parent();
virtual ~Parent();
};
#endif // PARENT_H
#include "childa.h"
ChildA::ChildA()
{
cout << "in Child A const\n";
}
ChildA::~ChildA()
{
cout << "in Child A destructor\n";
}
#include "childb.h"
ChildB::ChildB()
{
cout << "in Child B const\n";
}
ChildB::~ChildB()
{
cout << "in Child B destructor\n";
}
#include "parent.h"
Parent::Parent()
{
cout << "in Parent const\n";
}
Parent::~Parent()
{
cout << "in Parent destructor\n";
}
为什么我没有看到被称为析构函数? 对象变量应该超出main的范围,应该调用析构函数,不是吗?
答案 0 :(得分:1)
您的对象永远不会超出范围,因为您的应用程序不存在(即您不会超出主要功能的范围)。你需要关闭你的应用程序,你这样做:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Parent one;
ChildA two;
ChildB three;
// This will immediately terminate the application
QTimer::singleShot(0, &a, SLOT(quit()));
return a.exec();
}
请注意,您可以将计时器设置为在特定时间内执行,对于上面的示例,我将其设置为在0 ms后执行。
如果您不想关闭该应用程序,则可以强制使用范围
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// Force scope
{
Parent one;
ChildA two;
ChildB three;
}
return a.exec();
}