程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ 不使用virtual實現多態,virtual多態

C++ 不使用virtual實現多態,virtual多態

編輯:C++入門知識

C++ 不使用virtual實現多態,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;
}

下面是運行結果:

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved