本条款作者所要表达的用意就是对于virtual成员函数的功能实现可以以其他形式代替。有的时候单纯的virtual函数可能无法满足真实编程的需要。
第一种方法:
定义一个private virtual函数,再定义一个non-virtual函数,non-virtual函数调用private virtual函数实现功能。
代码如下:
class person
{
public:
virtual int getHealth(){return health;}
private:
int health;
};
class child:public person
{
};
child c;
c.getHealth();//获得健康指数
对比:
class person
{
public:
int getHealth()
{
getHealthValue();
}
private:
int getHealthValue(){return health;}
int health;
};
class child:public person
{
};
child c;
c.getHealth();//获得健康指数
第二种方法是函数指针法。将获得健康指数的功能函数的函数指针存储为类的private数据成员。通过这种方式,可以随时通过变换函数指针使用不同类型的评估标准。同类的不同之间的健康评估标准也不一定相同。程序灵活性很大。
class Person
{
private:
int health;
public:
typedef int(*HealthFunc)(const Person&);
Person(int bh = 10, HealthFunc Func= NULL)
:health(bh), Poniter(Func){}
int GetHealthValue()
{
if (Poniter)
{
return Poniter(*this);
}
else
{
return 0;
}
}
int GetBaseHealth() const
{
return health;
}
private:
HealthFunc Poniter;
};
class child : public Person
{
public:
child(int bh, HealthFunc Func) :Person(bh, Func){}
};
int HealthForCommonMonster(const Person& gc)
{
return gc.GetBaseHealth();
}
int HealthForKnightBoss(const Person& gc)
{
return 2 * gc.GetBaseHealth();
}
child d;
d.GetHealthValue();