歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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;
}

下面是運行結果:

Copyright © Linux教程網 All Rights Reserved