您的位置:首页 > 编程语言 > C语言/C++

Effective C++ 条款35

2015-06-01 10:28 411 查看
本条款作者所要表达的用意就是对于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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: