zoukankan      html  css  js  c++  java
  • C++_day8pm_多态

    1.什么是多态

      

      

    2.

      

      示例代码:  

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 //形状:位置、绘制
     6 //+--圆形:半径、(绘制)
     7 //+--矩形:长宽、(绘制)
     8 //形状
     9 class Shape{
    10 public:
    11         Shape(int x, int y): m_x(x), m_y(y){}
    12         virtual void draw(void) const
    13         {
    14             cout << "形状(" << m_x << ',' << m_y << ')' << endl;
    15         }
    16     
    17 protected:
    18     int m_x;
    19     int m_y;
    20 };
    21 
    22 //圆形
    23 class Circle: public Shape{
    24 public:
    25     Circle(int x, int y, int r): Shape(x, y), m_r(r){}
    26     void draw(void) const
    27     {
    28         cout << "圆形(" << m_x << ',' << m_y << ',' << m_r << ')' << endl;
    29     }
    30 private:
    31     int m_r;
    32 };
    33 
    34 //矩形
    35 class Rectangle: public Shape{
    36 public:
    37     Rectangle(int x, int y, int w, int h): Shape(x, y), m_w(w), m_h(h){}
    38     void draw(void) const
    39     {
    40         cout << "矩形(" << m_x << ',' << m_y << ',' << m_w << ',' << m_h << ')' << endl;
    41     }
    42 private:
    43     int m_w;
    44     int m_h;
    45 };
    46 
    47 void render(Shape* shapes[])
    48 {
    49     for(size_t i = 0; shapes[i]; ++i)
    50         shapes[i]->draw();
    51 }
    52 
    53 void drawAny(Shape const& shape)
    54 {
    55     shape.draw();
    56 }
    57 
    58 int main(void)
    59 {
    60     Shape* shapes[10] = {0};
    61     shapes[0] = new Circle (1,2,3);
    62     shapes[1] = new Circle(4,5,6);
    63     shapes[2] = new Rectangle(7,8,9,10);
    64     shapes[3] = new Rectangle(11,12,13,14);
    65     shapes[4] = new Circle(15,16,17);
    66     render(shapes);
    67     /*
    68     Circle c(18,19,20);
    69     Shape& r = c;
    70     r.draw();
    71     */
    72     Circle cr(18,19,20);
    73     drawAny(cr);
    74     Rectangle rc(21,22,23,24);
    75     drawAny(rc);
    76     
    77     return 0;
    78 }

     协变类型只能是指针或者引用,不能是对象。

     

    纯抽象类:

      全部由纯虚函数构成的抽象类称为纯抽象类或者接口。

    动态: 编译阶段产生,运行阶段执行。

     1 //模板方法模式---好莱坞模式
     2 #include <iostream>
     3 
     4 using namespace std;
     5 
     6 class Parser{
     7 public:
     8     void parse(char const* filename)
     9     {
    10         cout << "开始解析" << filename << "文件..." << endl; 
    11         drawText();
    12         drawCircle();
    13         drawRectangle();
    14         drawImage();
    15         cout << "解析" << filename << "文件完成!" << endl;
    16     }
    17     
    18 private:
    19     virtual void drawText(void) = 0;
    20     virtual void drawCircle(void) = 0;
    21     virtual void drawRectangle(void) = 0;
    22     virtual void drawImage(void) = 0;
    23 
    24 };
    25 
    26 class Render: public Parser{
    27 private:
    28     void drawText(void)
    29     {
    30         cout << "绘制文字..." << endl;
    31     }
    32     void drawCircle(void) 
    33     {
    34         cout << "绘制圆形..." << endl;
    35     }
    36     void drawRectangle(void)
    37     {
    38         cout << "绘制矩形..." << endl;
    39     }
    40     void drawImage(void)
    41     {
    42         cout << "绘制图像..." << endl;
    43     }
    44 };
    45 
    46 int main(void) 
    47 {
    48     Render render;
    49     render.parse("stdc++.pdf");
    50     
    51     return 0;
    52 }

     注:虚表放在类中,虚表指针放在对象中。

  • 相关阅读:
    web.py利用模板的详细步骤
    Arduino入门笔记(9):蓝牙模块及第一辆蓝牙遥控小车
    Python常用模块之sys
    使用Supervisor管理Linux进程
    Python socket聊天室程序
    Ubuntu 文件文件夹查看权限和设置权限
    python遍历目录
    linux tail命令的使用方法详解
    Python使用openpyxl读写excel文件
    python中enumerate()的用法
  • 原文地址:https://www.cnblogs.com/lican0319/p/10742088.html
Copyright © 2011-2022 走看看