1、目录3.1 类的继承与派生3.2 派生类的构造与析构函数3.3 二义性问题与虚基类3.4 Qt自定义派生类3.5 Qt中的界面3.6 Qt常用部件3.1.1 派生类的定义交通工具汽车船水陆两栖车房子房车基类派生类基类派生类基类只有一个基类,是单继承有不止一个基类,是多继承3.1.1 派生类的定义classclass 派生类名:继承方式 基类1,继承方式 基类n /有多个基类时,/之间用逗号隔开,每个 /基类都要写明继承方式 派生类新增成员的声明;三选一:publicprivateprotected3.1.1 派生类的定义class Conveyance double speed;/时速 pub
2、lic:double getSpeedgetSpeed()return speed;class Car:public Conveyance int wheelsNum;/车轮数 public:int getWheelsNumgetWheelsNum()return wheelsNum;Conveyance类speedgetSpeed()Car类speedgetSpeed()wheelsNumgetWheelsNum()新增成员继承3.1.1 派生类的定义class House double area;/房屋面积 public:double getAreagetArea()return area
3、;class MotorHome:public Car,public House int waterReserve;/储水量,单位升 public:int getWaterReservegetWaterReserve()return waterReserve;Car类speedgetSpeed()wheelsNumgetWheelsNum()Speed()House类areagetArea()MotorHome类waterReservegetWaterReserve()speedgetSpeed()wheelsNumgetWheelsNum()areagetArea()继承继承新增成员3.1.
4、2 继承方式 基类基类成员成员函数函数基类基类对象对象privateprivate继承方式继承方式protectedprotected继承方式继承方式publicpublic继承方式继承方式派生类派生类新增成新增成员函数员函数派生类对象派生类对象派生类新增派生类新增成员函数成员函数派生类对象派生类对象派生类新增派生类新增成员函数成员函数派生类派生类对象对象基类基类privateprivate成员成员可访问不可访问基类基类protectedprotected成员成员不可访问可访问,访问权限转为private不可访问可访问,访问权限仍为或转为protected不可访问可访问,访问权限仍为prote
5、cted不可访问基类基类publicpublic成员成员可访问可访问,访问权限仍为public可访问表3-1 继承方式和访问特性3.1.2 继承方式保护继承自公有继承自祖先类private:protected:public:父亲类private:protected:protected:孩子类private:protected:protected:私有继承自公有继承自祖先类private:protected:public:父亲类private:private:private:孩子类private:private:private:图3-3 保护继承和私有继承的区别保护权限成员既实现了数据隐藏又很好
6、地实现了继承,而私有权限成员只是很好地实现了数据隐藏。3.1.3 重定义成员函数 派生类中允许声明和基类中的成员函数原型完全相同的新成员函数,新的同名成员函数需有自己新的函数实现,称作重定义成员函数(或重定义继承的函数)。例:在Conveyance类中声明公有成员函数showInfo,并在类外定义如下:void Conveyance:showInfo()coutSpeed per hour:speedendl;在Car类中声明公有成员函数showInfo,并在类外定义如下:void Car:showInfo()coutSpeed per hour:getSpeed()endl;coutNumb
7、er of wheels:wheelsNumendl;Car myCar;myCar.showInfo();myCar.Car:showInfo();ConveyanceConveyance:showInfo();();3.1.4 赋值兼容规则公有继承时,派生类对象可以赋值给基类对象。基类对象不能赋值给派生类对象。基类对象基类属性的内存空间派生类对象基类属性的内存空间派生类新增属性的内存空间值复制该部分值在赋值时被舍弃3.1.4 赋值兼容规则在用到基类对象时可以用其公有派生类对象代替,使用途径有:p可使用公有派生类对象赋值或初始化基类对象的引用。p函数形参是基类对象(或引用),对应的实参可使用
8、其派生类对象。p派生类对象的地址可以赋给指向基类对象的指针。例:有函数:void func(Conveyance a)a.showInfo();在已有Car类型对象myCar的情况下:语句:Conveyance x1,&x2=myCar,*ptr;ptr=&myCar;x1=myCar;func(myCar);都是合法的。目录3.1 类的继承与派生3.2 派生类的构造与析构函数3.3 二义性问题与虚基类3.4 Qt自定义派生类3.5 Qt中的界面3.6 Qt常用部件3.2 派生类的构造与析构函数构造函数和析构函数不能被派生类所继承,派生类中需要声明和实现自己的构造函数,以及必要的时候自定义析构
9、函数。注意:派生类构造函数在实现时,只需对本类中新增的成员进行初始化,基类部分的初始化会自动调用基类构造函数完成。派生类析构函数同理。3.2.1 实现方式构造函数定义的格式:派生类类名:派生类类名(基类所需形参,本类数据成员所需形参):基类名(基类实参)新增数据成员赋初值;/最好也写在初始化列表处 基类声明了带参构造函数时,派生类也应声明带参构造函数,并基类声明了带参构造函数时,派生类也应声明带参构造函数,并传参数给基类构传参数给基类构造函数造函数。基类声明了不带参构造函数时,派生类构造函数可不向基类构造函数传递参数。基类声明了不带参构造函数时,派生类构造函数可不向基类构造函数传递参数。此时,
10、基类部分的初始化调用的是基类不带参构造函数。此时,基类部分的初始化调用的是基类不带参构造函数。若基类中未声明构造函数,派生类中也可以不声明,此时全采用若基类中未声明构造函数,派生类中也可以不声明,此时全采用默认的构造函数默认的构造函数。不限顺序3.2.1 实现方式例:Conveyance类内添加公有构造函数如下:Conveyance(int spd):speed(spd)coutConstructor of Conveyance.endl;多基类的例子:House类内添加公有构造函数如下:House(double a):area(a)coutconstructor of House.endl;
11、则Car类内可添加公有构造函数如下:Car(int spd,int wN):Conveyance(spd),wheelsNum(wN)coutConstructor of Car.disconnect(SIGNAL(returnPressed();edit1-disconnect(this);3.4.4 自定义信号和槽3.自定义信号在上例在上例的基础上的基础上,考虑增加找彩蛋的功能:,考虑增加找彩蛋的功能:常规实现方式3.4.4 自定义信号和槽3.自定义信号emit 信号名(实参列表);3.4.4 自定义信号和槽4.普通成员函数作为槽 此种形式关联的槽不必用“slots:”声明。QObject
12、QObject:connect(&:connect(&发送对象,&,&类名:信号名,&接收对象,&,&类型:槽名或普通成员函数名););目录3.1 类的继承与派生3.2 派生类的构造与析构函数3.3 二义性问题与虚基类3.4 Qt自定义派生类3.5 Qt中的界面3.6 Qt常用部件3.5.1 命名空间命名空间:由用户自己定义的空间域。namespace 命名空间名实体的声明和定义;花括号中的实体可以是变量、常量、函数、结构体、类、模板等。可以定义在项目中的多个地方,如果命名空间名相同,则自动合并。可以嵌套定义,花括号中还可以是命名空间。定义在全局范围内,不可以定义在函数中。3.5.1 命名空间
13、使用方式:嵌套时:在某范围内需多次使用某命名空间时:命 名 空 间命 名 空 间Myspace1嵌套的命名空间嵌套的命名空间MyInterspace命名空间名:实体名外层命名空间名:内层命名空间名:实体名using namespace 命名空间名;3.5.2 快速实现界面设计部件面板部件面板自定义窗口自定义窗口信号槽编辑器信号槽编辑器显示子部件列表显示子部件列表设置当前选中部件的设置当前选中部件的属性属性布局等按钮布局等按钮快速查找部快速查找部件件动作动作编辑器编辑器3.5.2 快速实现界面设计1.按下并拖动按下并拖动2.选中选中3.修改修改4.点击点击5.设置设置3.5.2 快速实现界面设计
14、mywidget.hmywidget.cppui_mywidget.h3.5.3 信号槽的自动关联3.5.3 信号槽的自动关联自定义窗口类中,自动关联的槽需符合的命名规则:ui_mywidget.hon_发射者对象名_信号名目录3.1 类的继承与派生3.2 派生类的构造与析构函数3.3 二义性问题与虚基类3.4 Qt自定义派生类3.5 Qt中的界面3.6 Qt常用部件3.6.1 Buttons按钮部件按钮部件为用户下达执行命令、选择某个功能等提供了交互操作。勾选时,互斥勾选时,互斥按钮部件为用户下达执行命令、选择某个功能等提供了交互操作。3.6.1 Buttons按钮部件2.填写填写3.拖动到
15、这里拖动到这里1.点击点击输入部件为用户输入信息、设置数据提供支持。3.6.2 Input Widgets输入部件多 行 纯多 行 纯文本框文本框多行文多行文本框本框单行单行纯纯文本框文本框下拉列表下拉列表字体下拉列表字体下拉列表数字旋框数字旋框浮点数旋框浮点数旋框转盘转盘滑动部件滑动部件滚动条滚动条日期编辑框日期编辑框日期时间编辑框日期时间编辑框输入部件为用户输入信息、设置数据提供支持。3.6.2 Input Widgets输入部件水平水平布局布局垂直垂直布局布局使用分使用分裂器水裂器水平布局平布局使用分使用分裂器垂裂器垂直布局直布局在窗体布在窗体布局中布局局中布局栅 格栅 格布局布局打破布局打破布局调整大小调整大小切换到设置绑定伙伴切换到设置绑定伙伴关系的界面关系的界面切换到设切换到设置置 T a b 顺顺序的界面序的界面3.6.3 Display Widgets显示部件显示部件用于向用户展示各种信息。对于gif:QMovie*mv=new QMovie(:/res/a.gif);ui-label-setMovie(mv);mv-start();标签标签标签标签文本浏览器文本浏览器液晶数字部件液晶数字部件日历日历部件部件进度条进度条线线第3章 继承与派生