虚函数主要是指用关键字virtual 修辞的。
如果一点还不了解虚函数的还会问,为什么需要用虚函数, 使用虚函数又会有什么好处呢?
下面先举一个简单的例子吧:
class A {
public:
void show() {qDebug() << "this is test A";}
};
class B : public A{
public:
void show {qDebug() << "this is test B";}
};
然后开始使用两个函数:
A a;
B b;
A *p;
p = &a;
p->show() ;
p = &b;
p->show();
我们会发现,这两个输出的值都是父类的 this is test A。
而如果我们在父类A 里面加一个关键字, virtual 让它变成虚函数:
class A {
public:
virtual void show() {qDebug() << "this is test A";}
};
然后再次使用两个函数:
A a;
B b;
A *p;
p = &a;
p->show() ;
p = &b;
p->show();
我们会发现,这两个输出的值都是 this is test A , this is test B;
这就是所谓的多态, 父类生成的对象, 被赋值给子类或父类的对象时, 如果是虚函数的话, 会根据赋值对象来选择对应的接口, 当然,如果子类没有重写父类的虚函数,则直接调用父类的。 这也使用户,多一个选择接口。
谈到虚函数, 就容易联想到纯虚函数。
什么是纯虚函数, 又有什么特点呢?
1.
纯虚函数,是声明后面加了一个=0, 下面列举一下三个各自的声明特点:
普通函数: void test();
虚函数: virtual void test();
纯虚函数: virtual void test() = 0;
2.纯虚函数不能有定义。它只需声明, 而且子类,必须为父类的纯虚函数写出它的实现。
没有定义,那有什么用呢? 它的用户就在于, 保持统一性。
比如说, 定义一个动物类, 它的特点是能知道它吃什么东西。 但每种动物吃的东西都不一样, 于是每种动物都应该实现,你想要的这个能吃什么东西的功能。
所以纯虚函数,就是实现, 父类所规定的,必须应该有的一个特点。