qt 上使用虚函数的经验

来源:互联网 发布:绝缘电阻数据怎么填 编辑:程序博客网 时间:2024/05/29 16:05

首先为什么要用虚函数

作为面向对象的语言而不是基于对象,要把程序做到工程化,好用,继承起来快捷,让其他程序员能看懂甚至他们都不用懂就会改你的程序

基于这么多的原因必须使用c++的精髓:继承,多态

而这里面虚函数就显得非常重要


虚函数有什么作用

虚函数作为一个函数,它可以像重载一样有多次定义,而在调用的时候根据当前指针的情况指向不同类,使用不同的功能,只用同一个接口


在qt上怎么使用

首先既然写虚函数,就是为了继承和派生的时候使用方便,所以首先还是要先写好父类。

在父类里面也分自己使用的函数和子类将要继承的函数,如果在子类继承的函数里有哪个函数是要给子类继承而且要作为虚函数使用,

那么在.h文件声明前要加上virtual,如:virtual void turnOn();  

接着在.cpp文件里面定义如:

void BasicEquip::turnOn()
{
    QByteArray d;
    d.append(0x13);
    zigbee->sendPackage(equipAddr,1,1,d);//because send to equip dont need location and type,so enter 1 and 1
}

接下来就是要在子类中继承:

class Equip_Alarm: virtual public BasicEquip
{
public:
    Equip_Alarm(qint16 address);
};


这样继承的话如果一旦调用turnon()函数的话就是调用父类的函数,如:

BasicEquip *p;

p = new Equip_Alarm(address);

p->turnOn();

这时候就会直接调用父类的turnon();


而如果想调用子类自己的turnon()函数的话,在继承时只用加上

virtual void turnOn(); //virtual可加可不加

接着在.cpp文件定义你自己的turnon()函数,调用时便会调用子类的turnon()函数。


这样就成功的实现了虚函数的使用!!


但是如果工程复杂一点的话还会有很多情况:


1.如果有多个子类继承同一个父类,而且每个子类调用的函数都不一样,那么父类也没有定义函数的必要,只要声明即可

 这时候就会用到纯虚函数,如virtual void turnOn() = 0;


2.如果有多个子类继承同一个父类,同时子类间又各自有各自的虚函数是其他子类不需要的。

比如:

class A
{
public:
    A(int i );


    virtual void test();
    virtual void test2(){}
    virtual void test3(){}
};


class B : virtual public A
{
public:
    B(int i );


    void test2();

}

class C:public B
{
public:
    C(int i );


    void test3();
};


这样的话即使test2(),test3()不打算在父类里面定义,也要在声明后面加上{},因为一旦声明了一个函数为虚函数后,他必须在父类或所有子类都有它的定义,

所以最好的办法就是在父类就定义了,定义成一个空的函数。