不使用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; }
下面是運行結果: