理解Widget::Widget(QWidget *parent) :QWidget(parent)

1 Widget::Widget(QWidget *parent) :
2    QWidget(parent)
3 {
4 }

QT中这段代码如何理解呢?

首先,来看一个例子

#include 
using namespace std;
class Base
{
public:Base() :m_num(0){    // 构造函数让类范围的m_num被初始化. cout << "this is Base()" << endl;}Base(int val):m_num(val){cout << "this is Base(int val)" << endl;}
private:int m_num;
};

1 上方代码定义了一个基类Base,并且有两个构造函数,一个是默认构造函数,一个是有一个整型参数的构造函数。

class BaseChild: public Base
{
public:BaseChild(){cout << "this is BaseChild()" << endl;}BaseChild(int val): Base(val){cout << "this is BaseChild(val)" << endl;}
private:int m_num;
};

2 上方代码定义了一个BaseChild类,并继承Base类,同样的,它也定义了两个构造函数,一个默认,一个有整型参数。

int main(int argc, char *argv[])
{BaseChild child1;BaseChild child2(5);return 0;
}

3 main函数实例化了两个子类实例,child1,child2。child1调用默认构造函数。child2调用有整型参数的构造函数。

输出结果:

  • 创建child1时,是先调用了Base的默认构造函数,再调用自己的默认构造函数
  • 创建child2时,是先调用了Base(int)这个构造函数,再调用自己的整型参数构造函数。

回头看BaseChild的构造函数

BaseChild(int val): Base(val){cout << "this is BaseChild(val)" << endl;}

初始化列表中的Base(val)正是调用了我们Base基类的有参构造函数,而这样的写法就刚好是我们开头代码中的那段

Widget::Widget(QWidget *parent) :QWidget(parent)

所以可以类比一下:Widget是调用了QWidget下面的构造函数

所以得出如下总结:

总结: · 如果不指定构造函数,则派生类会调用基类的默认构造函数 · 派生类构造函数的初始化列表只能初始化派生类成员,不能直接初始化继承成员,如果想 要调用基类的有参构造函数,则可以在派生类的初始化列表中显示指定

参考博客

正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话 - 知乎


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部