码迷,mamicode.com
首页 > 编程语言 > 详细

Effective C++ 条款34 区分接口继承和是实现继承

时间:2015-09-09 22:38:27      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

1. C++对于函数成员的继承主要有三种:

    只继承接口,不继承实现;

    同时继承接口和实现,同时允许覆写实现;

    继承接口和实现,同时不允许对实现进行覆写.

2. 对于public继承,成员函数的接口应该总是被继承(由于is-a关系的存在),其中:

    pure-virtual函数的目的只是为了使派生类继承函数接口;

    impure-virtual(虚但非纯虚)函数的目的是既允许派生类继承接口和实现,又可以重写实现.

    non-virtual函数的目的是令派生类继承函数的接口以及一份强制实现.(如果想要重写,那么之前就应该设为virtual函数)

    public继承中,基类成员函数的种类应该遵循以上原则定义.

3. virtual函数既允许继承实现又允许重写实现的目的有时候会带来危险性,例如:

技术分享
class Base{
public:
    virtual fun(){...}
    ...
private:
    ...
}
class Derived:public Base{
public
    ...
private:
    ...
}
View Code

Derived忘记定义自己的fun函数,因此默认继承Base的fun函数,这有可能是程序员不想要的结果,为了防止以下结果,可以将fun函数设为protect函数并命名为defaultFun以指明它是缺省实现,要使用缺省实现,就在fun中显示调用defaultFun函数,如下:

技术分享
class  Base{
public:
    virtual void fun()=0;
    ...
protect:
    void defaultFun(){...}
    ...
private:
   ...
}
Derived:public Base{
public:
    virtual void fun{
        defaultFun();
    }
...
private:
    ...
} 
   
View Code

由于fun函数在Base中被设为pure-virtual,因此Derived必须提供自己的定义,而它可以主动使用Base提供的defaultFun函数作.这样既通过pure-virtual的fun函数实现了只继承接口的功能,又通过non-virtual的defaultFun函数提供了一份使用default版本的选择.(defaultFun设为protect的目的是提高尽可能高的封装性)

除了使用以上将接口与实现分离的方法,还可以采用为Base的pure-virtual函数fun提供定义的方式,即:

技术分享
class Base{
public:
    virtual void fun()=0;
    ...
private:
    ...
}
void Base::fun(){
    ...
}
View Code

Derived必须对fun函数进行实现,但如果想使用default实现,可以如以下定义:

技术分享
class Derived:public Base{
public:
    virtual void fun(){
        Base::fun();
    }
    ...
private:
    ...
}
View Code

 

Effective C++ 条款34 区分接口继承和是实现继承

标签:

原文地址:http://www.cnblogs.com/reasno/p/4796086.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!