c++与oc的多态性的实现原理

来源:互联网 发布:mac 获取当前用户名 编辑:程序博客网 时间:2024/06/02 06:24

         面向对象的基本特性:封装,继承,多态!

       我在这个重点介绍多态,所以多封装,继承就简单说一下!

      1.  封装:这是面向对象的根本,即一个结构不仅可以有数据成员,也可以有函数成员!可以把一个结构需要的属性以及针对于属性提供的方法封装在一个结构中,这个结构就是类!

      2. 继承:说简单点就是,子类继承父类,从而拥有了父类所有的特性!从上到下,大致分为3步, a 继承除了构造函数和析构函数外的所有属性和方法 b 添加自己特有的属性和方法 c 写自己的构造和析构!从本质上来讲,继承的本质是避免代码的重复编写!使得结构更简单,但是往远的来说,多态有脱离不了继承!

       今天的重点:

       多态:一个借口,多种实现,简单来说就是:通过父类指针指向不同的子类对象,调用一个借口,但是实际上确实调用不同的方法!在c++中通过虚函数来实现!而从本质上是通过虚表指针和虚表来实现的!

        c++:在一个类中一旦声明了虚函数,那么在给这个类中对象分配内存的时候,在最上面都会有一个指针,这个指针就是虚表指针,它指向的内存就是虚函数列表,其实就是一堆的函数地址,都是虚函数!普通的方法是不会存放在里面的!我们知道子类的创建过程,先初始化父类对象,到最后再初始化自己,析构则相反,先析构自己,再析构父类!所以在子类的初始化过程中,会把虚表指针指向自己的虚函数列表!

        所以,当父类指针指向子类对象,父类指针先通过虚表指针,查询虚 函数列表,如果有的话,调用,如果没有,那么继续在父类的普通方法中查询!也许有人问:为什么不在子类普通方法中查询!

       记住:计算机不会知道指针真正指向的是什么!只会按照指针的类型进行解释,比如:int  a = 10;

float b=a;那么b=10.0,但是如果是:int a = 10;int *b=&a;float *c=(float *)b;那么*c是多少,肯定不是10.0;因为:int 和 float 在内存中都有自己的确定的排列!比如 int 最简单,也许就是0x0000000a,在通过强制指针类型转化的时候,内存内容不会发生变化,但是float 在解释内存的时候,就会与int 有很大的区别,比如:前几位有可能是基数,后面几位是指数,最后代表正负!

         所以,父类指针指向子类对象,计算机其实会把指向的东西当做父类对象,所以只会查询父类的普通方法!

         同上:这也是一般为什么要把析构函数写成虚函数的原因。因为这个时候会优先调用子类的析构函数,在调用父类的,所以可以把子类的东西完成释放!!


             问一个问题:虚函数可以被作为内联函数??


      oc: 根本没有virtual,但是作为面向对象的语言,怎么实现多态!


          在oc中实现多态是很简单和自然的事情,只要清楚oc怎么访问变量和方法就知道了!在oc中所有的对象都有一个isa变量,这个变量指向对象的类,在类中有一个指针指向类的方法!

          所以当父类指针指向子类对象,在调用方法的时候,通过isa找到类,这个类就是子类本身!!

原创粉丝点击