• C++入门 -- 多态与虚函数


    举例:

    在一个聊天室里,有一群人,每个人都会说自己的话

    使用一个结构把一群人表达出来

    #include <stdlib.h>
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    class CPerson {
       public:
        CPerson() { m_nType = 0; }
        void speak() { cout << "speak" << endl; }
        int m_nType;
    };
    
    class CChinese : public CPerson {
       public:
        CChinese() { m_nType = 1; }
        void speak() { cout << "speak Chinese" << endl; }
    };
    
    class CEnglish : public CPerson {
       public:
        CEnglish() { m_nType = 2; }
        void speak() { cout << "speak English" << endl; }
    };
    int main(int argc, char const* argv[]) {
        CChinese chs;
        CChinese chs1;
        CEnglish eng;
    
        // some person
        CPerson* ary[3];
    
        ary[0] = &chs;   //子类转换为父类
        ary[1] = &chs1;
        ary[2] = &eng;
    
        ary[0]->speak();  //使用父类的指针调用,用的仍是父类的内存
        ary[1]->speak();
        ary[2]->speak();
    
        for (int i = 0; i < 3; i++) {
            cout << i + 1;
            if (ary[i]->m_nType == 1) {   
                CChinese* pChs = (CChinese*)ary[i];
                pChs->speak();
            } else if (ary[i]->m_nType == 2) {
                CEnglish* pEng = (CEnglish*)ary[i];
                pEng->speak();
            }
        }
    
        return 0;
    }

     使用以上方法,每当增加一个人时,就会很麻烦

    C++引用虚函数实现通过基类访问派生类的函数

     1 #include <stdlib.h>
     2 
     3 #include <iostream>
     4 #include <string>
     5 using namespace std;
     6 
     7 class CPerson {
     8    public:
     9     CPerson() { m_nType = 0; }
    10     virtual void speak() { cout << "speak" << endl; }   //虚函数
    11     int m_nType;
    12 };
    13 
    14 class CChinese : public CPerson {
    15    public:
    16     CChinese() { m_nType = 1; }
    17     void speak() { cout << "speak Chinese" << endl; }
    18 };
    19 
    20 class CEnglish : public CPerson {
    21    public:
    22     CEnglish() { m_nType = 2; }
    23     void speak() { cout << "speak English" << endl; }
    24 };
    25 int main(int argc, char const* argv[]) {
    26     CChinese chs;
    27     CChinese chs1;
    28     CEnglish eng;
    29 
    30     // some person
    31     CPerson* ary[3];
    32 
    33     ary[0] = &chs;
    34     ary[1] = &chs1;
    35     ary[2] = &eng;
    36 
    37     ary[0]->speak();
    38     ary[1]->speak();
    39     ary[2]->speak();
    40     return 0;
    41 }
    virtual

    out:

     C++的继承关系中,有两种成员函数:

    1、基类希望其派生类进行覆盖的函数;

    2、基类希望派生类直接继承而不需要改变的函数;

    对于情况1,基类通常将其定义为虚函数Virtual。当我们使用指针或引用调用该虚函数时,该调用将被动态绑定。

  • 相关阅读:
    Element filtername is not allowed here-web.xml version="3.0"-intellij idea
    探究JavaScript闭包
    telnet的安装和使用
    Oracle数据库常用的sql语句
    centos6上安装jenkins
    idea的maven项目不知道为啥下载不下来jar包,看本地仓库只是下载了一下xml文件,没有jar包问题
    Oracle数据库使用mybatis的时候,实体类日期为Date类型,mybatis里面定义的是Date类型,插入的时候,时分秒全部是12:00:00问题
    maven打包某个分支的包
    maven打包到私服,打的是war包,好郁闷
    多线程初学习
  • 原文地址:https://www.cnblogs.com/y4247464/p/13819862.html
Copyright © 2020-2023  润新知