zoukankan      html  css  js  c++  java
  • C 语言模拟 C++ 的多态(利用指针函数)

    C 模拟 C++ 的多态特性(指向派生类的基类指针在调用虚函数时是派生类重写的函数)

    利用的是函数指针,因为 C 的 struct 是不能有函数的(C++ 的struct可以)

    #include<iostream>
    using namespace std;
    
    struct A{
        virtual void func(){    //C++ 多态:通过虚函数实现
            cout << "A::func()" << endl;
        }
        int a;
    };
    
    struct B : public A{    //C++中继承:B类公继承A类
        void fun(){         //C++ 多台,通过虚函数实现,子类的关键字 virtual 可加可不加
            cout << "B:fun()" << endl;
        }
        int b;
    };
    
    
    //C模拟C++继承和多态
    typedef void (*FUN)();
    
    struct _A{      //父类
        FUN _fun;   //C语言中结构体里不能包含函数,只能使用函数指针在外面实现
        int _a;
    };
    
    struct _B{      //子类
        _A _a_;     //在子类中定义一个基类的对象即可实现对父类的继承
        int _b;
    };
    
    void _fA(){     //父类的同名函数
        printf("_A:_fun()
    ");
    }
    
    void _fB(){     //子类的同名函数
        printf("_B:_fun()
    ");
    }
    
    void test(){
    
        //测试C++的继承和多态
        A a;    //定义一个父类对象 a
        B b;    //定义一个子类对象 b
        A* p1 = &a;     //定义一个父类指针指向父类的对象
        p1->func();     //调用父类的同名函数
    
        p1 = &b;        //让父类指针指向子类的对象
        p1->func();     //调用子类的同名函数
    
        //C 语言模拟继承和多态的测试
        _A _a;          //定义一个父类对象
        _B _b;          //定义一个一个子类对象
        _a._fun = _fA;  //父类的对象调用父类的同名函数
        _b._a_._fun = _fB;  //子类对象调用子类的同名函数
    
        _A* p2 = &_a;       //定义一个父类指针指向父类对象
        p2->_fun();         //调用父类的同名函数
        p2 = (_A*)&_b;      //让父类指针指向子类的对象,由于类型不匹配所以需要强制转换
        p2->_fun();         //调用子类的同名函数
    }
    
    int main(){
        test();
    }
  • 相关阅读:
    洛谷P1091 :合唱队形
    NBUT[1026]: 汽车加油问题
    automaticallyAdjustsScrollViewInsets 标签栏不正常显示
    dyld: Symbol not found: _OBJC_CLASS_$_UIBlurEffect
    UIColor -colorWithAlphaComponent
    怎样让外界无法改变自定义view的尺寸大小
    UITableViewCell
    tabBar自定义
    iOS7以后的侧滑返回上一页
    backBarButtonItem无效
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/14692967.html
Copyright © 2011-2022 走看看