• C++ 不使用virtual实现多态


    不使用virtual实现多态可以用成员函数指针完成。

    成员函数指针形式:返回类型(A::*指针名)(形参表)

                             其中A是类类型,即这个指针是指向A类的成员函数的函数指针

                             例如:int(A::*P)(int,int)这是一个指向 “A类的带有两个int型形参且返回值是int的成员函数” 的指针,指针名是P。

    下面是代码:

    #include<iostream>
    using namespace std;
    class Base;
    typedef int(Base::*p)();//定义成员函数指针类型
    class Base
    {
    public:
        p virtual_p;//成员函数指针
        Base()
        {
            //初始化成员函数指针指向基类test
            virtual_p = (int(Base::*)())&Base::test;
        }
        ~Base(){}
        int test()//判断virtual_p的指向,如果指向派生类test就返回派生类的test调用
        {
            if (virtual_p == &Base::test)
            {
                cout << "Base" << endl;
                return 1;
            }
            else
                return (this->*virtual_p)();//返回派生类test调用,对virtual_p解引用后是test函数
        }
    };
    class Derived :public Base
    {
    public:
        Derived()
        {
            //初始化成员函数指针指向派生类test
            virtual_p = (int(Base::*)())&Derived::test;
        }
        ~Derived(){}
        int test()
        {
            cout << "Derived" << endl;
            return 2;
        }
    };
    int main()
    {
        Base *b;//基类指针
        Derived d;//派生类对象
        Base bb;//基类对象
        //指向基类对象时调用基类test,指向派生类对象时调用派生类test,模拟了动态关联
        b = &d;
        cout << b->test() << endl;
        b = &bb;
        cout << b->test() << endl;
        return 0;
    }

    下面是运行结果:

  • 相关阅读:
    程序编译与代码优化 -- 早期(编译期)优化
    Java字节码指令
    知识点
    Openresty配置文件上传下载
    Openresty + nginx-upload-module支持文件上传
    G1日志分析
    Garbage First(G1)垃圾收集器
    Java内存分析工具jmap
    编译JDK1.7
    Java服务CPU占用高问题定位方法
  • 原文地址:https://www.cnblogs.com/zjc0202/p/4398204.html
Copyright © 2020-2023  润新知