effective c++ 笔记 (31-34)



//---------------------------15/04/20----------------------------



//#32   确定你的public继承塑膜出 isa 关系

{

/*

    1>子类is-a父类。

        如果以public形式继承,你便是告诉c++编译器说,每一个类型为子类的对象同时也是一个父类的对象。

        也就是父类表现出更一般化的概念。

    2>只要是父类能用到的地方,子类也一定能有用,但是如果什么地方子类能用,父类就不一定能用了。

    3>isa的困惑点:

        1)bird能飞,企鹅是bird,所以也能飞:

            这里首先bird并不是都能飞的,所以这里应该分类成flybirdnotflybird。企鹅就能继承

            notflybird了。

          然而有些系统并不会用到企鹅,而且能飞的bird还是很多的,所以可以适当考虑不去区分能不能飞

          也就是学会灵活变通。

        2)正方形是一个矩形:

            矩形调整长度的时候,宽度是不会变的,但是正方形调整长度的时候,宽度要跟着变化。

            所以解决办法是改写正方形的SetWidthSetHeight,让这两个函数在改动一个时,另一个跟着变。

            毕竟正方形是一个特殊的长方形,你要改变我的长,ok,宽度也必须跟着变。

*/

}


//#33   避免遮掩继承而来的名称

{

//  先看看下面的代码:

    class Base

    {

    public:

        virtual void mf1();

        virtual void mf1(int);

        virtual void mf3();

        virtual void mf3(int);

    };

    

    class Derived : public base

    {

        virtual void mf1();//并没有定义mf1(int),所以基类的mf1(int)就被遮盖了。

        using Base::mf1;    //这样才能让mf1(int)被看见。

        virtual void mf3()

        {

            Base::mf3();    //!!!!!如果是private继承!!!!!!!(不是private继承就不要这么做),这么做

                            //可以故意遮盖基类的mf3(int),只留下基类的mf3()

        }

    };

}


//#34   区分接口继承和实现继承

{

/*

    1:子类继承接口总是有三种情况:

        1>只继承函数接口,不继承实现:pure virtual函数能实现这样的功能。

        2>继承接口和缺失实现: impure virtual函数。这时会有可能造成危险情况。因为这个接口没有要求客户强制

          实现,所以如果在有必要的情况下,客户却没有实现,则会造成错误。

          解决办法就是:基类提供一个缺失实现的成员函数,子类继承接口的时候,如果想要缺省实现,直接调用基类

          提供的成员函数就行。这时接口声明成pure virtual的,子类就必须重新实现,至于要不要缺省情况,就看子类

          自己调不调用了。

        3>继承接口和强制性实现(不允许修改)non_virtual函数。声明为non_virtual意味着基类不想子类重定义这个

          接口。

    2:错误情况:

        1>全部实现为non_virtual函数,这一的设计使得子类无法定制自己的情况。而且析构函数必须是virtual(

          果你想让这个类作为基类的话)

        2>全部实现为virtual,例外:interface classes,除了这个类接口,其他的类不应该把接口全设置为virtual

          因为这可能是class设计者缺乏坚定立场的前兆。某些函数就是不该被重定义的!

*/

}


转载于:https://www.cnblogs.com/boydfd/p/4983128.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值