不使用virtual实现多态可以用成员函数指针完成。
成员函数指针形式:返回类型(A::*指针名)(形参表)
其中A是类类型,即这个指针是指向A类的成员函数的函数指针
例如:int(A::*P)(int,int)这是一个指向 “A类的带有两个int型形参且返回值是int的成员函数” 的指针,指针名是P。
下面是代码:
#include
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;
}
下面是运行结果:
