C++ 封装,继承,多态

封装继承多态是C++最基本的三大特性

 

 

 

 

封装:

  利用抽象数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节,但可以通过该对象对外的提供的接口来访问该对象。

封装的优点:

1.提高了数据的安全性 别人不能够通过 变量名.属性名 的方式来修改某个私有的成员属性

2.操作简单 封装后,多个调用者在使用的时候,只需调用方法即可,调用者不需要再进行判断

3.隐藏了实现 实现过程对调用者是不可见的,调用者只需调用方法即可,不知道具体实现过程

继承:

  继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。

继承的优点:

1代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;
2 提高代码的重用性;
3 提高代码的可扩展性;
4 提高产品或项目的开放性;

多态:

  C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖或者称为重写。而重载则是允许有多个同名的函数,而这些函数的参数列表不同,允许参数个数不同,参数类型不同,或者两者都不同。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。

  多态是运行时动态绑定的。

  实现动态绑定的条件:

  1.只有指定为虚函数的成员函数才能进行动态绑定

  2.必须通过基类类型的引用或指针进行函数调用

 

  虚函数:

    virtual void speak(){}

  //动态多态满足条件:
  //1.存在继承关系
  //2.子类重写父类的虚函数
  //动态多态的调用
  //父类指针或者引用指向子类的对象
  class Anmial
  {
    public:
    virtual void speak()
    {
      cout << "1"<< endl;
    }
  };

  class Cat :public Anmial
  {
    public:
      void speak()
      {
        cout << "2" << endl; 
      }
  };

  //地址早绑定,编译阶段确定函数地址
  //如果想执行派生类函数,需要运行时绑定

  //子类中的虚函数内部会替换为子类虚函数的地址

  void dospeak(Anmial &animal)
  {
    animal.speak();
  }

  void test()
  {
    Cat cat;
    doSpeak(cat);
  }

  

  纯虚函数
    virtual 返回值类型 函数名(参数列表)= 0 ;
  //当类中有纯虚函数,这个类也成为抽象类

  class Base
  {
    public:
      virtual void func() = 0;
  };

  class Son :public Base
  {
    public:
      void func()
      {
      }
  };
  //1.抽象类无法实例化对象
  //2.抽象类子类必须重写父类中的纯虚函数,否则也属于抽象类

 

多态的优点:

1.代码组织清晰

2.可读性强

3.利于前期和后期的扩展及维护

 

posted @ 2022-03-15 15:50  好好看书,天天向上  阅读(264)  评论(0)    收藏  举报