c++有多态的特性,所以我们可以写出很抽象的代码,例如有如下的继承结构:
class Employee
{
public:
virtual ~Employee();
virtual int GetSaraly() const = 0;
private:
int m_nSaraly;
};
class Programmer : public Employee
{
...
public:
virtual int GetSalary() const
{
m_nSaraly = ...;
return m_nSaraly;
}
};
class Manager : public Employee
{
...
public:
virtual int GetSalary() const
{
m_nSaraly = ...;
return m_nSaraly;
}
};
一个打印工资的函数可以是这样:
void PrintSaraly(Employee* pEmployee)
{
cout << pEmployee->GetSaraly() << endl;
}
PrintSaraly既可以打印出Programmer的工资,也可以打印Manager的工资,若有第三种员工,PrintSaraly可以不做任何修照样处理不误。用OO的术语来讲,这是因为设计符合了OCP。
在C里面要达到同样的效果,该怎么办?C里面也可以做到,只是稍嫌麻烦。把class Employee换成struct Employee就可以实现。代码如下:
typedef int (*GetSalary)(void);
typedef struct tagEmployee
{
GetSalary saralyPtr;
} Employee;
int GetSaralyOfProgrammer(void)
{
int nSaraly = ...;
return nSaraly;
}
int GetSaralyOfManager(void)
{
int nSaraly = ...;
return nSaraly;
}
C版本的PrintSaraly则变成了如下这个样子:
void PrintSaraly(Employee* pEmployee)
{
int nSaraly = (*pEmployee->saralyPtr)();
printf("%d\r\n", nSaraly);
}
通过给struct Employee的saralyPtr设置不同的函数地址,同样达到了多态的目的。例如,在需要打印Programmer的工资时,我们可以这样:
Employee employee;
employee.saralyPtr = GetSaralyOfProgrammer;
PrintSaraly(employee);
打印manager的工资也很类似:
Employee employee;
employee.saralyPtr = GetSaralyOfManager;
PrintSaraly(employee);
c版本的PrintSaraly不做任何修改的情况下也能处理新的员工类型,只需要添加一个GetSaralyOfXXX的函数就行。
那这种模拟究竟有什么用呢?不要以为我吃饱了饭没事做,在只能用C编程的地方,这种模拟还是很多的。