【C++】虚函数与纯虚函数

参考《C/C++程序员面试宝典》

虚函数与纯虚函数

虚函数的主要作用是建立抽象模型,从而可以达到方便扩展系统的目的。

纯虚函数是指被标明为不具体实现的虚函数,是一种特殊的虚函数。

两者的区别

虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的形式为:

virtual 函数返回值类型 虚函数名 (形参表)
{
    函数体
}

虚函数扩展了派生类对象中隐藏基类函数的概念,当程序处于相似家族的异构对象集合时,要使用到这些函数。

纯虚函数是一种特殊的虚函数,它的一般格式如下:

class <类名>
{
    virtual <类型><函数名>(形参表) = 0;
    ...
}

在很多情况下,基类中不能对虚函数给出有意义的实现,而把它们说明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。

虚函数与纯虚函数的区别在于:纯虚函数是虚函数的一个子集,用于抽象类,含有纯虚函数的类就是抽象类,它不能生成对象。

如何使用纯虚函数

为了方便实用多态,编程者常常需要在基类中定义虚拟函数。在很多情况下,积累本身生成对象是不合情理的。例如,动物作为一个基类可以派生出猴子、犀牛等子类,但动物本身生成对象明显不合理。

为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数,则编译器要求在派生类中必须予以重载以实现多态性。同时含有纯虚函数的类称为抽象类,不能生成对象。这样就很好的解决了上述两个问题。一个纯虚函数使用的示例代码如下

class A
{
public:
    A();
    void f1();
    virtual void f2();
    virtual void f3() = 0;
    virtual ~A();
}               //定义基类

class B: public A       //定义子类
{
public:
    B();
    void f1();
    void f2();
    void f3();
    virtual ~B();
}

int main(int argc, char* argv[]) //主函数
{
    A *m_j = new B();
    m_j -> f1();
    m_j -> f2();
    m_j -> f3();
    delete m_j;
    return 0;
}

在上面代码中,f1()是一个普通的重载。调用m_j->f1();回去调用A类中的f1,它是在编程者写好代码的时候就定好的。也就是根据它是由A类定义的,这样就调用这个类的函数。f2()是虚函数。调用m_j->f2();会调用m_j到保存的对象中,对应的这个函数,这是由于new的B对象。f3()与f2()一样,只是在基类中不需要写函数实现。

纯虚函数用来定义没有意义的实现,用于抽象类中需要交给派生类具体实现的方法。

猜你喜欢

转载自blog.csdn.net/alidada_blog/article/details/82894821
今日推荐