美文网首页C++的知识分享程序员C++
15. C++抽象基类和纯虚成员函数

15. C++抽象基类和纯虚成员函数

作者: 飞扬code | 来源:发表于2019-04-09 08:04 被阅读7次

    公共接口是指一系列成员函数的集合,支持该接口的类必须以合适的方式重新定义这些成员函数,否则就无法创建对象。
    在C++中,可以通过抽象基类来实现公共接口。为了介绍抽象基类,我们需要先来了解一下纯虚成员函数。

    纯虚成员函数的声明语法如下:

        virtual 函数返回类型 函数名 (函数参数) = 0;
    

    纯虚成员函数没有函数体,只有函数声明,在纯虚函数声明结尾加上“=0”表明此函数为纯虚成员函数。

    包含纯虚成员函数的类即为抽象基类,之所以说它抽象,那是因为它无法实例化,也即无法用于创建对象。

    #include<iostream>
    using namespace std;
    
    class base
    {
    public :
        virtual void display() = 0;
        //......
    };
    
    int main()
    {
        base b; //compile error
        return 0;
    }
    

    抽象基类是无法用于创建对象的,而主函数中我们尝试创建base类的对象,这是不允许的,编译提示语法错误。

    纯虚成员函数可以被派生类继承,如果派生类不重新定义抽象基类中的所有(有多个则要重新定义多个)纯虚成员函数,
    则派生类同样会成为抽象基类,因而也不能用于创建对象。

    #include<iostream>
    using namespace std;
    
    class base
    {
    public :
        base(){x = 0;}
        base(int a){x = a;}
        virtual void display() = 0;
        int getx(){return x;}
    private:
        int x;
    };
    
    class derived1 : public base
    {
    public:
        derived1(int a){ y = a;}
    private:
        int y;
    };
    
    class derived2 : public base
    {
    public:
        derived2(int a, int b):base(a){ z = b;}
        void display()
        {
            cout<<getx()<<" "<<z<<endl;
        }
    private:
        int z;
    }
    
    int main()
    {
        base b;    //compile error
        derived1 d1(5);   //compile error
        derived2 d2(5,6);
        d2.display();
        return 0;
    }
    

    主函数中创建base类的对象,因为base类包含一个纯虚成员函数,因此是抽象基类,不能创建对象。
    创建derived1的对象,derived1类继承了基类base中的纯虚成员函数,并且没有重新定义该函数,因此derived1类虽然是base类的派生类,但它仍然是抽象基类,因此同样不能创建对象。
    创建derived2类的对象,该类同样是base类的派生类,同样从base类中继承了纯虚成员函数display,但是该类中同时也重新定义了该函数,因此覆盖了基类的纯虚成员函数,该类不是抽象基类,因此可以创建对象。

    注意:
    1、一个纯虚成员函数就可以使类成为抽象基类,但是抽象基类中除了包含纯虚成员函数外,同样可以包含其它成员函数或成员变量。
    2、只有类中的虚函数才能被声明为纯虚成员函数,普通成员函数和顶层函数均不能声明为纯虚成员函数。
    3、抽象基类可以用于实现公共接口,在抽象基类中声明的纯虚成员函数,派生类如果想要能够创建对象,则必须全部重新定义这些纯虚成员函数。

    相关文章

      网友评论

        本文标题:15. C++抽象基类和纯虚成员函数

        本文链接:https://www.haomeiwen.com/subject/ibdviqtx.html