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

    */

    }


  • 相关阅读:
    1063. Set Similarity
    A1047. Student List for Course
    A1039. Course List for Student
    最大公约数、素数、分数运算、超长整数计算总结
    A1024. Palindromic Number
    A1023. Have Fun with Numbers
    A1059. Prime Factors
    A1096. Consecutive Factors
    A1078. Hashing
    A1015. Reversible Primes
  • 原文地址:https://www.cnblogs.com/boydfd/p/4983128.html
Copyright © 2011-2022 走看看