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