幽魂国度

 

C++中的接口与实现

        所谓接口继承,就是派生类只继承函数的接口,也就是声明;而实现继承,就是派生类同时继承函数的接口和实现。
       我们都很清楚C++中有几个基本的概念,虚函数、纯虚函数、非虚函数。
       虚函数
       C++实现运行中的多态性是通过虚函数实现的,而虚函数必须存在于继承环境下。
       因此,虚函数是指一个类中你希望进行重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的成员函数。虚函数用来表现基类和派生类的成员函数之间的一种关系。虚函数的定义在基类中进行,在需要定义为虚函数的成员函数的声明前冠以关键字,如 virtual void func() 。 基类中的某个成员函数被声明为虚函数后,此虚函数就可以在一个或多个派生类中被重新定义. 在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同。
        虚函数是重载的一种表现形式,是一种动态的重载方式。
       只有类的普通成员函数可以定义为虚函数,全局函数及静态成员函数(类拥有)不能声明为虚函数。
       纯虚函数:
        纯虚函数在基类中没有定义且只能在基类中定义,但未给出具体的函数定义体(实现),它们被初始化为0。任何用纯虚函数派生的类,都要自己提供该函数的具体实现。
         定义纯虚函数:virtual void func() = 0;
         定义了纯虚函数的类被称之为抽象类。抽象类定义一族派生类的共同接口,而接口的完整实现,即纯虚函数的函数体,由派生类自己定义。
例://class Shape
       public:
                 virtual void area()=0; // 纯虚函数
        //class Tringle : public Shape  //公有继承
       public:
                void area() {//}                /接口与实现
         抽象类可以有多个纯虚函数,也可以定义其他虚函数。若派生类没有重新定义纯虚函数,那么该派生类也称之为纯虚函数。
         纯虚函不需要定义其实际操作,它的存在只是为了在派生类中被重新定义,只是提供一个多态接口
       非虚函数
       一般成员函数,无virtual关键字修饰。
        至于为什么要定义这些函数,我们可以将虚函数、纯虚函数和非虚函数的功能与接口继承实现继承联系起来:
         如前所述,声明一个纯虚函数(pure virtual)的目的是为了让派生类只继承函数接口,也就是上面说的接口继承。
        纯虚函数一般是在不方便具体实现此函数的情况下使用。也就是说基类无法为继承类规定一个统一的缺省操作,但继承类又必须含有这个函数接口,并对其分别实现。但是,在C++中,我们是可以为纯虚函数提供定义的,只不过这种定义对继承类来说没有特定的意义。因为继承类仍然要根据各自需要实现函数。
        通俗说,纯虚函数就是要求其继承类必须含有该函数接口,并对其进行实现。是对继承类的一种接口实现要求,但并不提供缺省操作,各个继承类必须分别实现自己的操作。
        声明非纯虚函数(impure virtual)的目的是让继承类继承该函数的接口和缺省实现。
        与纯虚函数唯一的不同就是其为继承类提供了缺省操作,继承类可以不实现自己的操作而采用基类提供的默认操作。
        声明非虚函数(non-virtual)的目的是为了令继承类继承函数接口及一份强制性实现。
        相对于虚函数来说,非虚函数对继承类要求的更为严格,继承类不仅要继承函数接口,而且也要继承函数实现。也就是为继承类定义了一种行为。
 总结
        纯虚函数:要求继承类必须含有某个接口,并对接口函数实现。
        虚函数:继承类必须含有某个接口,可以自己实现,也可以不实现,而采用基类定义的缺省实现。
        非虚函数:继承类必须含有某个接口,必须使用基类的实现。
         一个C++类有着两个重要的方面:用于描述行为的公共接口,以及行为的私有实现。
       大多数的继承都是公有继承:派生类继承了基类的接口和实现。不过,我们也可以进行有选择的继承,即派生类可以只继承接口或实现。私有基类,只继承实实现,没有接口;公有继承基类,继承接口,但继承的实现可能是不完整的或不存在的(纯虚函数)。
 例:
我们可以用函数:
 Triangle t;
 t.area();
我们只是使用了其接口,但具体的实现可以不知道。void area() {......}

posted on 2009-11-21 20:20 阅读(1614) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜