2009-09-21

来源:互联网 发布:阿里云算法大赛 编辑:程序博客网 时间:2024/05/17 09:45

1,公有继承意味着是一种的关系。Has a;

  //哲学观点就是一般与个别,共性与个性的关系;

 例如,如果函数参数接受一个被继承的类)(基类),那么继承类同样可以作为参数!,而倘若函数参数只接受继承类,那么传入基类将无法凑效。

2,有趣的企鹅是一种鸟,但企鹅不会飞的问题

    定义一个bird类,继承得到会飞的鸟类和不会飞的鸟类,企鹅类继承不会飞的鸟类。bird类不声明虚拟飞函数,不会飞的鸟类和企鹅类也不声明飞函数。那么如果执行 企鹅.fly()  将产生编译错误。是一种好的解决方案。注:在编译期间侦测产生的错误比在运行期间产生的错误要高明的多^_^.

3,矩形和正方形

   正方形是一种矩形,矩形可以改变宽高,那么正方形也可以改变宽高,但是正方形的宽高是相等的......?所以此时用公有继承描述他们关系是错误的!

 

4,什么叫协议类 protocal class

   协议类没有任何实现代码;作用只是为派生类指定一个接口。所以它往往没有数据成员,也就没有构造函数,但是有一个虚拟析构函数。模样如下:

    class Person{

    public:

               virtual ~ Person();

               virtual string name() const = 0;

               virtual string birthDate() const = 0;

               virtual string address() const = 0;

               virtual string nationality() const = 0;

};

5,protocal class 有一个扮演构造函数的函数称为 factory functiion 或者virtual constructor! 一般称为protocal class的static 函数

 static Person* makeperson(const string &name,const Date&birthday,const Address &addr,const Country &country);

 

6,可以给纯虚拟函数提供定义。不过调用它们要指定其完整的类名称,即所谓的静态调用。

7,声明一个纯虚函数是为了让派生类只继承其接口。

8,声明一般的虚拟函数的目的是什么?

   Ans:是为了让继承类继承该函数的接口和缺省行为。

    意思是如果我不想再派生类中重写写一个这样的函数,那么我使用的将是基类提供的缺省行为。

9,声明非虚拟函数的目的是什么?

    Ans:是为了让派生类继承函数的接口及其实现。静态绑定

 

10,条款37:为什么不要重新定义继承来的非虚拟函数?

   如果重新定义,将出现难以理解的行为,决定因素不是在于指针所指之对象,而是指向该对象之指针当初的声明类型。

   例如:

          class B{

                  public:

                            void mf();

                        ...

                   };

       class D:public B{

                publilc:

                         void mf();

                       ...

                  };

      D x;

      B* pb = &x;       //获得指针,指向x;

      pb->mf();             // B::mf();

      D* pd = &x;         //获得指针,指向x;

     pd->mf();       //D:mf();

 

11,为什么不要重新定义继承而来的缺省参数值呢;

    因为缺省参数值和非虚拟函数一样是静态绑定;所以改写后呈现的不是期望的参数值。如果是虚拟函数,函数调用将表现出奇怪的组合。如果缺省参数值是动态绑定,那么编译器必须有每种办法,能够在执行期间为虚拟函数决定合适的缺省参数值,然后执行效率将受到影响。

原创粉丝点击