zoukankan      html  css  js  c++  java
  • 017_linuxC++之_多态的引入

    多态:一种接口,多种方法(同一种调用方法,根据不同的对象,调用不同类中的函数)
    静态联编:非虚函数,在编译时确定好
    动态联编:   1. 对象里有指针,指向虚函数表
          2. 通过指针,找到表,调用虚函数
          3. 图二
          4. virtual来定义为虚函数

    (一)首先我们来看静态联编,非多态的程序

     1 #include <iostream>
     2 #include <string.h>
     3 #include <unistd.h>
     4 
     5 using namespace std;
     6 
     7 class Human {
     8 public:
     9     void eating(void) { cout<<"use hand to eat"<<endl; }
    10 };
    11 
    12 class Englishman : public Human {
    13 public:
    14     void eating(void) { cout<<"use knife to eat"<<endl; }
    15 };
    16 
    17 
    18 class Chinese : public Human {
    19 public:
    20     void eating(void) { cout<<"use chopsticks to eat"<<endl; }
    21 };
    22 
    23 void test_eating(Human& h)
    24 {
    25     h.eating();
    26 }
    27 
    28 int main(int argc, char **argv)
    29 {
    30     Human h;
    31     Englishman e;
    32     Chinese c;
    33 
    34     test_eating(h);
    35     test_eating(e);
    36     test_eating(c);
    37 
    38     return 0;
    39 }
    View Code

    运行结果,调用的全部是Human中的,并不是我们想要的,因为这里是静态编译进去了,也就是说程序在编译时候就已经确定好就调用Human中的

    (二)动态编译,实现多态,在类中定义时候增加virtual来实现这个函数为虚函数

     1 #include <iostream>
     2 #include <string.h>
     3 #include <unistd.h>
     4 
     5 using namespace std;
     6 
     7 class Human {
     8 public:
     9     virtual void eating(void) { cout<<"use hand to eat"<<endl; }
    10 };
    11 
    12 class Englishman : public Human {
    13 public:
    14     virtual void eating(void) { cout<<"use knife to eat"<<endl; }
    15 };
    16 
    17 
    18 class Chinese : public Human {
    19 public:
    20     virtual void eating(void) { cout<<"use chopsticks to eat"<<endl; }
    21 };
    22 
    23 void test_eating(Human& h)
    24 {
    25     h.eating();
    26 }
    27 
    28 int main(int argc, char **argv)
    29 {
    30     Human h;
    31     Englishman e;
    32     Chinese c;
    33 
    34     test_eating(h);
    35     test_eating(e);
    36     test_eating(c);
    37 
    38     return 0;
    39 }
    View Code

    运行结果,就实现了同一接口,不同调用的方法了

    (三)更多具体的,,,,,,,

  • 相关阅读:
    Java Message Service学习(一)
    二叉树的层序遍历算法实现
    二叉树的操作之统计二叉树中节点的个数
    java.uti.Random类nextInt方法中随机数种子为47的奇怪问题
    最大子序列和问题
    参数对象Struts2中Action的属性接收参数
    方法字段[C# 基础知识系列]专题二:委托的本质论
    struts2属性Struts2中属性接收参数中文问题和简单数据验证
    权限检查联系人ProfileProvider
    最小较小codeforces 2B The least round way
  • 原文地址:https://www.cnblogs.com/luxiaoguogege/p/9696061.html
Copyright © 2011-2022 走看看