一道Apple公司(中国)的面试题目
Apple在中国(上海)有公司业务,但是感觉主要是做测试工作的部门,主要是保障Apple的产品质量QE。面试的时候,面试官出了一道题目,我貌似曾今开过类似的题目,但是由于当场发挥不佳没有答出来。题目大意是这样的:
在公司的某个通信协议中存在这样一个场景,甲给乙发送了一个数据帧,这个数据帧最前面的一个字节代表是数据帧的类型(总共四种),只可能为0,1,2,3。甲每次给乙发送一个数据包后,乙要通过自己写程序调用对应数据帧类型的函数来对这个数据帧进行处理。处理函数必须要和帧相对应,不然得不到真确的结果。要求不能使用if...else...,switch和三目表达式语句。
题目到这里,想必大家都已经知道可以使用C++的虚函数来做,可是到底应该怎么写呢?下面给出一种实现方法。
#include <iostream> using namespace std; typedef void (*pFunc)(void); class Solution{ public: virtual void func1(){ cout << "func1 executed ..." << endl;} virtual void func2(){ cout << "func2 executed ..." << endl;} virtual void func3(){ cout << "func3 executed ..." << endl;} virtual void func4(){ cout << "func4 executed ..." << endl;} void doSomething(int frame_id) { if(frame_id >= 0 && frame_id <=3){ pFunc pf; pf = (pFunc)*((int *)*(int *)this + frame_id); pf(); } } }; int main(){ Solution sln; sln.doSomething(0); sln.doSomething(1); sln.doSomething(2); sln.doSomething(3); return 0; }
执行结果如下:
其中关于如何获取指向虚函数的指针的方法,可以参见文章:http://www.cppblog.com/xczhang/archive/2008/01/20/41508.html