zoukankan      html  css  js  c++  java
  • 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;
    }

    下面是运行结果:

  • 相关阅读:
    线性筛素数
    redis集成springmvc
    shiro登录权限认证
    jQuery插件
    maven多项目配置
    w
    触发器
    后悔了可以找我我们是朋友
    url upload data
    排队
  • 原文地址:https://www.cnblogs.com/zjc0202/p/4398204.html
Copyright © 2011-2022 走看看