歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++ 不使用virtual實現多態

C++ 不使用virtual實現多態

日期:2017/3/1 9:29:23   编辑:Linux編程

不使用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