zoukankan      html  css  js  c++  java
  • 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设计者缺乏坚定立场的前兆。某些函数就是不该被重定义的!

    */

    }


  • 相关阅读:
    BADI 笔记
    ALV 常用功能 转载
    F4字段搜索帮助
    全省各地均可拨打劳动违法投诉电话:12333
    小结SQL Server连接失败错误及解决
    sql server日志已满处理方法
    VC6.0快捷键大全
    Eclipse下UML插件及安装
    Delphi错误:"External exception C0000235"
    delphi中临界操作方法
  • 原文地址:https://www.cnblogs.com/boydfd/p/4983128.html
Copyright © 2011-2022 走看看