C++学习笔记--继承与多态

1:关于继承(inheritance)的概念

   在C++中有“has A" 和 "is A"的 两个概念。 

 1.1  ” has A“即为在一个类定义中包含另一个类的对象:

    class A

   {

 class B;

  }

  1.2: "Is A" 即我们说的继承: 如下,B继承A, A为基类,B为A的派生类,B继承了A的所有数据成员和成员函数。

   class A: public class B

  {

  }

1.3: 关于upcasting 和downcasting

 1.3.1: 因派生类继承了基类的所有数据成员和成员函数,因此指向基类的指针或引用可以指向派生类对象。

           这即为隐式upcasting 强制转换。

            B b; A &a = b;

           B b; A *a = &b;

  1.3.2:  因派生类不但继承了基类的所有数据成员和成员函数,还增加自己独有的数据成员或成员函数,

          因此不能直接将将一个派生类的引用或指类直接指向一个基类对象,因为派生类的部分数据成员呀

          成员函数可能没有。

Class A

   {

}

Class B: public A

          A  a; 

 B &b = a; //不能这样做

         A  a;

B *b = &a; //不能这样做

1.4: 关于虚函数

   1.41 派生类不仅可能会增加成员函数也可能重定义基类的实现的函数以实现派生类所需要的功能。

           C++引入虚函数概念(virtual), 基类将该成员函数声明为virtual函数,派生类则可以重定义基类中已实现的成员函数

            以实现不同的功能。这样因为调用成员函数的对象类型不同而使得函数实现的功能不同即为多态。

   class A

 {

virtual  method1(arg1);

};

class B:public A

{

virtual method(arg1,arg2);

};

  1.4.2:  如基类的某个成员函数被声明的virtual,则其在派生类也为virtual。

  1.4.3: 派生类中重定义的virtual函数会隐藏其类中的函数重载。如想使该成员函数在派生类中也重载,

                则应在派生类对中每个virtual重载函数重新定义

    class A

  {

virtual  method1(arg1);

       virtual  method1(arg1,arg2,arg3);

};

class B:public A

{

virtual method(arg1);

virtual  method1(arg1,arg2,arg3);

};

1.4: 关于动态绑定和静态绑定

     1.4.1: 静态绑定 即编译时绑定:编译时根据函数名和函数参数列表来决定执行哪个函数.

eg:

  class A

  {

 method1(arg1)

};

class B:public A

{

};


        A a;

        A &b = a;

       a.method1(arg1); //这时调用 的是A.0000000000method1(arg1);

      B b;

      A &a = b;

     a.method1(arg1);       //这时仍然调用 的是A.method1(arg);


        

      1.4.2: 动态绑定: 因为派生类中可能重定了基类中的成员函数(vitual函数),因此有时需

                  根据调用成员函数的对象类型来选择使用哪个成员函数定义来执行,这即为

                  动态绑定。

        eg:

  class A

  {

virtual  method1(arg1);

       virtual  method1(arg1,arg2,arg3);

};

class B:public A

{

virtual method(arg1);

virtual  method1(arg1,arg2,arg3);

};


        B b;

       A &a = b;

      b.method1(arg1); //这时调用 的是B.method1(arg1);

    

     A a;

     A &b = a;

    b.method1(arg1);       //这时调用 的是A.method1(arg);


      1.5:关于虚析构函数

           不管是否声明了虚成员函数,都有必要声明一个虚析构函数,尽管它可能什么也没做。

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值