小朋友学C++(12):多态

作者: 海天一树X | 来源:发表于2017-11-07 19:36 被阅读73次

(一)

先编写函数:

#include <iostream> 
using namespace std;
 
class Shape
{
   protected:
      int width, height;
      
   public:
      Shape( int a = 0, int b = 0)
      {
         width = a;
         height = b;
      }
      
      int area()
      {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};

class Rectangle: public Shape
{
   public:
      Rectangle( int a = 0, int b = 0)  
      { 
      }
      
      int area ()
      { 
         cout << "Rectangle class area :" <<endl;
         return (width * height); 
      }
};

class Triangle: public Shape
{
   public:
      Triangle( int a=0, int b=0) : Shape(a, b) { }
      
      int area ()
      { 
         cout << "Triangle class area :" <<endl;
         return (width * height / 2); 
      }
};


int main( )
{
   Shape *shape;
   Rectangle rec(10,7);
   Triangle  tri(10,5);
 
   // 存储矩形的地址
   shape = &rec;
   // 调用矩形的求面积函数 area
   shape->area();
 
   // 存储三角形的地址
   shape = &tri;
   // 调用三角形的求面积函数 area
   shape->area();
   
   return 0;
}

运行结果:

Parent class area :
Parent class area :

程序分析:
(1)Shape( int a = 0, int b = 0)
这里直接给函数的形参赋了默认的初值,作用是:在函数调用时,省略部分或全部参数,这时就会使用默认参数进行代替
(2)Rectangle( int a = 0, int b = 0) : Shape(a, b) { }
这段代码的意思是,在构造函数Rectangle中,先调用父类的构造函数Shape。
(3)shape指针调用函数 area() 时,被编译器设置为基类中的版本,这就是所谓的静态多态,或静态链接--函数调用在程序执行前就准备好了。
有时候这也被称为早绑定,因为 area() 函数在程序编译期间就已经设置好了。

(二)

对程序稍作修改,在 Shape 类中,area() 的声明前放置关键字 virtual,如下所示

class Shape
{
   protected:
      int width, height;
      
   public:
      Shape( int a = 0, int b = 0)
      {
         width = a;
         height = b;
      }
      
      virtual int area()
      {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};

运行结果:

Rectangle class area :
Triangle class area :

程序分析:
(1)虚函数
虚函数是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。
我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。
虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。
(2)此时,编译器看的是指针的内容,而不是它的类型。因此,由于 tri 和 rec 类的对象的地址存储在 *shape 中,所以会调用各自的 area() 函数。
正如您所看到的,每个子类都有一个函数 area() 的独立实现。这就是多态的一般使用方式。有了多态,您可以有多个不同的类,都带有同一个名称但具有不同实现的函数。



更多内容请关注微信公众号


wchat.jpg

相关文章

  • 小朋友学C++(12):多态

    (一) 先编写函数: 运行结果: 程序分析:(1)Shape( int a = 0, int b = 0)这里直接...

  • 深刻剖析之c++博客文章

    三大特性 封装、继承、多态 多态 C++ 虚函数表解析C++多态的实现原理 介绍了类的多态(虚函数和动态/迟绑定)...

  • 多态的C++实现

    多态的C++实现 1 多态的原理 什么是多态?多态是面向对象的特性之一,只用父类指针指向子类的对象。 1.1 多态...

  • C++ 的多态(Polymorphism), virtual f

    多态 c++支持两种多态,编译时多态和运行时多态但其实编译时多态根本不是真正的多态,编译时多态就是函数的重载,ov...

  • C++第六篇多态

    C++中的多态性分为编译时多态性和运行时多态性,编译时多态通过函数重载和模板体现,运行多态通过虚函数体现编译、连接...

  • 面试题目收集总结

    C++: 多态: 多态性都有哪些?(静态和动态,然后分别叙述了一下虚函数和函数重载) c语言和c++有什么区别?(...

  • C++的多态

    C++三大特性:封装、继承和多态。其中最好理解的就是封装了,继承作为C++面向对象的特征也不难理解,那么多态,应该...

  • 实现golang语言的多态

    如何实现golang语言的多态? C++里面有多态是其三大特性之一,那么golang里面的多态我们该怎么实现? g...

  • Swift 多态实现探究

    多态 父类指针指向子类对象 Swift 中多态的实现类似于 c++ 中的虚表 OC 多态实现利用的是 Runtim...

  • C++编译期多态和运行期多态

    C++多态有多种实现方式,在面对对象编程时,采用的是运行期多态,也称动态多态。在泛型编程中,多态基于模板的具现化与...

网友评论

    本文标题:小朋友学C++(12):多态

    本文链接:https://www.haomeiwen.com/subject/mqxsmxtx.html