C++基础---纯虚函数

1. 纯虚函数

1.1 纯虚函数的定义

  • 纯虚函数:是一种特殊的虚函数;
  • 纯虚函数的作用:让类先具有一个操作名称,而没有操作内容,让派生类在继承时再去具体地给出定义;
  • 纯虚函数的实现:在基类中实现的虚函数的函数原型后加“=0”;
  • 代码示例:

    class <类名>
    {
    virtual <类型><函数名>(<参数表>)=0;
    …
    };
    即:virtual void funtion()=0;

    注:一般而言纯虚函数的函数体是缺省的,但是也可以给出纯虚函数的函数体(此时纯虚函数变为虚函数),这一点经常被人们忽视,调用纯虚函数的方法为baseclass::virtual function。

1.2 纯虚函数与抽象类

  • 凡是含有纯虚函数的类叫做抽象类。这种类不能声明对象,只是作为基类为派生类服务。除非在派生类中完全实现基类中所有的的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象;
  • 如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类是不能被直接调用的。必须被子类继承重载以后,根据要求调用其子类的方法;

1.3 纯虚函数的引入原因

  • 为了方便使用多态特性,我们常常需要在基类中定义虚函数。
  • 在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
  • 定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。
  • 纯虚函数的意义,让所有的类对象(主要是派生类对象)都可以执行纯虚函数的动作,但类无法为纯虚函数提供一个合理的缺省实现。所以类纯虚函数的声明就是在告诉子类的设计者,“你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它”。
    注:为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;)。若要使派生类为非抽象类,则编译器要求在派生类中,必须对纯虚函数予以重写以实现多态性。同时含有纯虚函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。

1.4 纯虚函数的实例

  • 代码示例:

    
    #include <iostream>
    
    using namespace std;
    
    class A
    {
    public:
        A(){}
        virtual ~A(){}
    
    public:
        virtual void func1() = 0;
    };
    
    class B : public A
    {
    public:
        B(){}
        virtual ~B(){}
    
    public:
        virtual void func1()
        {
            cout<<"派生类B实现了抽象类A中定义的func1()的操作内容"<<endl;
        }
    };
    
    class C : public A
    {
    public:
        C(){}
        ~C(){}
    
    public:
        virtual void func1() = 0;
    };
    
    class D : public C
    {
    public:
        D(){}
        ~D(){}
    
    public:
        virtual void func1()
        {
            cout<<"派生类D实现了抽象类C->抽象类A中定义的func1()的操作内容"<<endl;
        }
    };
    
    int main()
    {
        cout<<"基类A中定义了纯虚函数virtual void func1() = 0;,因此基类A为抽象类"<<endl;
        cout<<endl;
    
        B b;
        b.func1();
    
        A *pb = new B;
        pb->func1();
        delete pb;
    
        cout<<endl;
    
        //C c;
        //c.func1();
    
        //A *pc = new C;
        //pc->func1();
        //delete pc;
    
        cout<<"由于派生类C中没有实现抽象类A的纯虚函数,因此C类仍然是抽象类,无法实例化对象"<<endl;
        cout<<"error LNK2001: unresolved external symbol public: virtual void __thiscall C::func1(void) (?func1@C@@UAEXXZ)"<<endl;
        cout<<endl;
    
        D d;
        d.func1();
    
        A *pd = new D;
        pd->func1();
        delete pd;
    
        return 0;
    }

参考文献:
[1]《C++全方位学习》范磊——第十三章
[2]《C++程序设计教程(第二版)》钱能——第五章、第六章、第七章
[3]《C++ Primer(第5版)》王刚 杨巨峰——第一章、第六章
[4] 百度搜索关键字:C++函数、纯虚函数

你可能感兴趣的:(抽象类,纯虚函数,多态性,C++函数)