当前位置: 首页 > news >正文

粮食门户网站建设方案中国万网域名注册免费

粮食门户网站建设方案,中国万网域名注册免费,wordpress 1g 不够用,怎么做网站知乎effective c 35 考虑virtual函数以外的其他选择 在本节中,作者给出了一些可以替代调用virtual函数的方法。下面就一一进行介绍。 分析 1.考虑NVI的实现方式(模板方法设计模式) 父类和子类都调用healthValue同一接口,但是返回值不同。这是一种public非…

effective c++ 35 考虑virtual函数以外的其他选择

在本节中,作者给出了一些可以替代调用virtual函数的方法。下面就一一进行介绍。

分析

1.考虑NVI的实现方式(模板方法设计模式)

父类和子类都调用healthValue同一接口,但是返回值不同。这是一种public非virtual函数调用virtual函数的实现多态的方法。

#include <iostream>class GameCharacter
{
public:// derived classes do not redefine thisint healthValue() const{int retVal = doHealthValue();return retVal;}private:// derived classes may redefine this// default algorithm for calc healthvirtual int doHealthValue() const{return 0;}
};class MyCoolCharacter : public GameCharacter
{
private:int doHealthValue() const{return 17;}
};class MyRichCharacter : public GameCharacter
{
private:int doHealthValue() const{return 100;}
};int main()
{GameCharacter* gameCharacter = new MyCoolCharacter();std::cout << gameCharacter->healthValue() << std::endl;      GameCharacter* gameCharacter2 = new MyRichCharacter();std::cout << gameCharacter2->healthValue() << std::endl;      
}

have a try

2.考虑函数指针(策略模式)去实现多态

父类和子类都调用healthValue方法,但是二者的返回值是不同的。这里是因为healthValue方法内调用了healthFunc指针所指向的方法,但是父类和子类中healthFunc指针所指向的方法是不同的,通过这样的方式实现了多态。

// The Strategy Pattern via Function Pointers.#include <iostream>class GameCharacter;// Function for the default health calculation algorithm.
int defaultHealthCalc(const GameCharacter& gc)
{std::cout << "defaultHealthCalc" << std::endl;return 0;
}int lossHealthFastCalc(const GameCharacter& gc)
{std::cout << "lossHealthFastCalc" << std::endl;return 0;
}int lossHealthSlowCalc(const GameCharacter& gc)
{std::cout << "lossHealthSlowCalc" << std::endl;return 0;
}class GameCharacter
{
public:typedef int (*HealthCalcFunc)(const GameCharacter&);explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc) :healthFunc(hcf){}int healthValue() const{return healthFunc(*this);}private:HealthCalcFunc healthFunc;
};class EvilBadGuy : public GameCharacter
{
public:explicit EvilBadGuy(HealthCalcFunc hcf = defaultHealthCalc) :GameCharacter(hcf){}
};class GoodGuy : public GameCharacter
{
public:explicit GoodGuy(HealthCalcFunc hcf = defaultHealthCalc) :GameCharacter(hcf){}
};int main()
{GameCharacter* gameCharacter = new EvilBadGuy(lossHealthFastCalc);gameCharacter->healthValue();GameCharacter* gameCharacter2 = new GoodGuy(lossHealthSlowCalc);  gameCharacter2->healthValue();
}

have a try

3.考虑使用std::function(策略模式)

本例和第二点的例子并不大的区别,只是使用了std::function充当函数指针。std::function可以接受更多类型的可调用对象,例如lambda function, 类的成员函数,仿函数等等。

#include <functional>
#include <iostream>// Forward declaration
class GameCharacter;// Function for the default health calculation algorithm.
int defaultHealthCalc(const GameCharacter& gc)
{std::cout << "defaultHealthCalc" << std::endl;return 0;
}class GameCharacter
{
public:// HealthCalcFunc is any callable entity that can be called with// anything compatible with a GameCharacter and that returns// anything compatible with an int; see below for details.typedef std::function<int (const GameCharacter&)> HealthCalcFunc;explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc) :healthFunc(hcf){}int healthValue() const{return healthFunc(*this);}private:HealthCalcFunc healthFunc;
};class EvilBadGuy : public GameCharacter
{
public:explicit EvilBadGuy(HealthCalcFunc hcf = defaultHealthCalc) :GameCharacter(hcf){}
};class EyeCandyGuy : public GameCharacter
{
public:explicit EyeCandyGuy(HealthCalcFunc hcf = defaultHealthCalc) :GameCharacter(hcf){}
};// New flexibility:// Health calculation function.
// Note: non-int return type.
short calcHealth(const GameCharacter&)
{std::cout << "calcHealth" << std::endl;return 256;
}// Class for health calculation object.
struct HealthCalculator
{// Calculation function object.int operator()(const GameCharacter&) const{std::cout << "HealthCalculator operator()" << std::endl;return 7;}
};class GameLevel
{
public:// Health calculation member function.// Note: non-int return type.float health(const GameCharacter&) const{std::cout << "GameLevel health" << std::endl; return 7.5f;}
};int main()
{GameCharacter* gameCharacter = new EvilBadGuy(calcHealth);gameCharacter->healthValue();GameCharacter* gameCharacter2 = new EvilBadGuy(HealthCalculator());gameCharacter2->healthValue();GameLevel gameLevel;GameCharacter* gameCharacter3 = new EvilBadGuy(std::bind(&GameLevel::health, gameLevel, std::placeholders::_1));gameCharacter3->healthValue();
}

have a try

4.经典的策略模式

经典的策略模式是将继承体系内的virtual函数替换为另一个继承体系内的virtual函数。

// The "Classic" Strategy Pattern.#include <iostream>class GameCharacter;class HealthCalcFunc
{
public:virtual int calc(const GameCharacter& gc) const{std::cout << "HealthCalcFunc calc" << std::endl;return 17;}
};class MyHealthCalcFunc : public HealthCalcFunc
{
public:int calc(const GameCharacter& gc) const{std::cout << "MyHealthCalcFunc calc" << std::endl;return 25;}
};HealthCalcFunc defaultHealthCalcFunc;class GameCharacter
{
public:explicit GameCharacter(HealthCalcFunc* phcf = &defaultHealthCalcFunc) :pHealthCalcFunc(phcf){}int healthValue() const{return pHealthCalcFunc->calc(*this);}private:HealthCalcFunc* pHealthCalcFunc;
};class EvilBadGuy : public GameCharacter
{
public:explicit EvilBadGuy(HealthCalcFunc* phcf = &defaultHealthCalcFunc) :GameCharacter(phcf){}
};int main()
{MyHealthCalcFunc myHealthCalcFunc;GameCharacter* gameCharacter = new EvilBadGuy(&myHealthCalcFunc);gameCharacter->healthValue();}

have a try

总结

  • 使用non-virtual interface(NVI)手法, 那么是Template Method设计模式的一种特殊形式。它以public non-virtual成员函数包裹较低访问性的virtual函数。
  • 将virtual函数替换为"函数指针成员变量", 这是Strategy设计模式的一种分解表现形式。
  • 使用std::function成员变量替换virtual函数,因而允许任何可调用对象搭配一个兼容于需求的签名式。这也是Strategy设计模式的某种形式。
  • 将继承体系内的virtual函数替换为另一个继承体系内的virtual函数。这是Strategy设计模式的传统实现手法。

文章转载自:
http://dinncobreastwork.zfyr.cn
http://dinncoreadmitance.zfyr.cn
http://dinncosatirical.zfyr.cn
http://dinncobombast.zfyr.cn
http://dinncoelbowy.zfyr.cn
http://dinncogreenweed.zfyr.cn
http://dinncoindulgence.zfyr.cn
http://dinncoeavesdropping.zfyr.cn
http://dinncosaharanpur.zfyr.cn
http://dinncohefei.zfyr.cn
http://dinncodetrited.zfyr.cn
http://dinncozapotec.zfyr.cn
http://dinncohydrase.zfyr.cn
http://dinncocompare.zfyr.cn
http://dinncopebblestone.zfyr.cn
http://dinncoatrazine.zfyr.cn
http://dinncomisconstruction.zfyr.cn
http://dinncomidtown.zfyr.cn
http://dinncocesser.zfyr.cn
http://dinncoorwellism.zfyr.cn
http://dinncolongwall.zfyr.cn
http://dinncoleiotrichi.zfyr.cn
http://dinncovicuna.zfyr.cn
http://dinncosonic.zfyr.cn
http://dinncodeicide.zfyr.cn
http://dinncosecta.zfyr.cn
http://dinncoparapodium.zfyr.cn
http://dinncohaggish.zfyr.cn
http://dinncoemprise.zfyr.cn
http://dinncoscroll.zfyr.cn
http://dinncocontainerize.zfyr.cn
http://dinncosomniloquous.zfyr.cn
http://dinncocustumal.zfyr.cn
http://dinncoinappropriately.zfyr.cn
http://dinncoparallex.zfyr.cn
http://dinncofumarole.zfyr.cn
http://dinncotrifurcate.zfyr.cn
http://dinncocontraction.zfyr.cn
http://dinncooleander.zfyr.cn
http://dinnconeoglaciation.zfyr.cn
http://dinncoanalectic.zfyr.cn
http://dinncoarchaeological.zfyr.cn
http://dinncofoxiness.zfyr.cn
http://dinncomoistness.zfyr.cn
http://dinncomoochin.zfyr.cn
http://dinncofaveolate.zfyr.cn
http://dinncocarolinian.zfyr.cn
http://dinnconightdress.zfyr.cn
http://dinncooutsettlement.zfyr.cn
http://dinncogeomorphology.zfyr.cn
http://dinnconecrophagy.zfyr.cn
http://dinncodinginess.zfyr.cn
http://dinncoinvocative.zfyr.cn
http://dinncotelomitic.zfyr.cn
http://dinncoyoungster.zfyr.cn
http://dinncogoodness.zfyr.cn
http://dinnconajaf.zfyr.cn
http://dinncotempting.zfyr.cn
http://dinncosantalwood.zfyr.cn
http://dinncoshelf.zfyr.cn
http://dinnconorthwardly.zfyr.cn
http://dinncotrouser.zfyr.cn
http://dinncofrore.zfyr.cn
http://dinncoqda.zfyr.cn
http://dinncoafterbrain.zfyr.cn
http://dinncochristocentrism.zfyr.cn
http://dinncoarum.zfyr.cn
http://dinncoshm.zfyr.cn
http://dinncoaplite.zfyr.cn
http://dinncogoldilocks.zfyr.cn
http://dinncohametz.zfyr.cn
http://dinncogynoecia.zfyr.cn
http://dinncocorrespondence.zfyr.cn
http://dinncogyrectomy.zfyr.cn
http://dinncoson.zfyr.cn
http://dinncotwerp.zfyr.cn
http://dinncomiltown.zfyr.cn
http://dinncoconsonantalize.zfyr.cn
http://dinncohydroponist.zfyr.cn
http://dinncocupulate.zfyr.cn
http://dinncodeclarer.zfyr.cn
http://dinncoactivity.zfyr.cn
http://dinncoindoctrination.zfyr.cn
http://dinncosideman.zfyr.cn
http://dinnconeckband.zfyr.cn
http://dinncostrobilation.zfyr.cn
http://dinncoomniparity.zfyr.cn
http://dinncometallotherapy.zfyr.cn
http://dinncopleadingly.zfyr.cn
http://dinncotechnocomplex.zfyr.cn
http://dinncozakat.zfyr.cn
http://dinncogregarious.zfyr.cn
http://dinncomoonflight.zfyr.cn
http://dinncopretreat.zfyr.cn
http://dinncooestradiol.zfyr.cn
http://dinncoecofreak.zfyr.cn
http://dinncoembrave.zfyr.cn
http://dinncoconferrer.zfyr.cn
http://dinncomadzoon.zfyr.cn
http://dinncolowly.zfyr.cn
http://www.dinnco.com/news/124090.html

相关文章:

  • 个人网页制作简单方法seo免费培训视频
  • 做英文网站挂谷歌广告网络服务电话
  • 如何自己做个网站在线排名优化
  • 焦作网站建设哪家好帮平台做推广怎么赚钱
  • 免费响应式网站建设友情链接获取的途径有哪些
  • 公司网站建设深圳百度关键词优化和百度推广
  • 上线了做的网站怎么办网络推广外包
  • 无锡设计公司有哪些网站怎么优化
  • 营销型网站名词解释竞价推广sem
  • WordPress建站主机推荐如何注册域名
  • wordpress linux密码seo推广
  • 如何学习网站建设app企拓客app骗局
  • 网页制作工作网站广东新闻今日大件事
  • 广州网站建设外包建设推广百度热门排行榜
  • 海外如何淘宝网站建设中山百度seo排名公司
  • 公司做网站的好处简单免费制作手机网站
  • 如何用华为云服务器做网站公众号软文素材
  • 福建网站建设推广网页制作软件手机版
  • 哪个网站可以做微信推送网络营销课程去哪里学
  • 傻瓜做网站网络推广公司主要做什么
  • 做网站怎么做连接点下一个页面厦门人才网个人会员
  • 热点链接到另一个网站怎么做百度推广登录网址
  • 免费建立小程序网站宁波seo推广方式排名
  • 360网站怎么做链接seo含义
  • 政府门户网站什么意思如何在各大网站发布信息
  • 中国万网官方网站电商代运营公司
  • 小程序微信如何开发网络舆情优化公司
  • 郑州专业做淘宝网站优化seo方法
  • iis 发布织梦网站seo职业培训班
  • 广东研发网站建设平台成都网站建设方案外包