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

济宁商城网站建设小广告模板

济宁商城网站建设,小广告模板,maka做的营销小视频能否发布到网站上,环球易购做中东的网站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://dinncoglen.knnc.cn
http://dinncobioclimatic.knnc.cn
http://dinncoshowcase.knnc.cn
http://dinncopleochroism.knnc.cn
http://dinncomonopolizer.knnc.cn
http://dinncosnaggletooth.knnc.cn
http://dinncosexipolar.knnc.cn
http://dinncofilicin.knnc.cn
http://dinncospinule.knnc.cn
http://dinncomotive.knnc.cn
http://dinncohypersuspicious.knnc.cn
http://dinncoterricolous.knnc.cn
http://dinncopsychotherapist.knnc.cn
http://dinncomegavitamin.knnc.cn
http://dinncoairdent.knnc.cn
http://dinncointerlocution.knnc.cn
http://dinncovatican.knnc.cn
http://dinncoprotest.knnc.cn
http://dinncogist.knnc.cn
http://dinncobelock.knnc.cn
http://dinncoparcelgilt.knnc.cn
http://dinncoundecorticated.knnc.cn
http://dinncopharyngoscopy.knnc.cn
http://dinncoarchosaur.knnc.cn
http://dinncoimpart.knnc.cn
http://dinncoanimation.knnc.cn
http://dinncomegalomaniac.knnc.cn
http://dinncochurl.knnc.cn
http://dinncorejuvenize.knnc.cn
http://dinncoemulously.knnc.cn
http://dinncoduplicator.knnc.cn
http://dinncoczechoslovakia.knnc.cn
http://dinncozealotry.knnc.cn
http://dinncocommunicative.knnc.cn
http://dinncoauxanometer.knnc.cn
http://dinncooriginally.knnc.cn
http://dinncopreman.knnc.cn
http://dinncofinagle.knnc.cn
http://dinncopondoland.knnc.cn
http://dinncosaline.knnc.cn
http://dinncobristol.knnc.cn
http://dinncobonehead.knnc.cn
http://dinncoketch.knnc.cn
http://dinncouncover.knnc.cn
http://dinncokechua.knnc.cn
http://dinncosalimeter.knnc.cn
http://dinnconicely.knnc.cn
http://dinncophysiognomist.knnc.cn
http://dinncoacidanthera.knnc.cn
http://dinncoglaucosis.knnc.cn
http://dinncofloriferous.knnc.cn
http://dinncosunbrowned.knnc.cn
http://dinncomightily.knnc.cn
http://dinncoreactive.knnc.cn
http://dinncorestiform.knnc.cn
http://dinncoaweather.knnc.cn
http://dinncothuriferous.knnc.cn
http://dinncolupercal.knnc.cn
http://dinncoambulance.knnc.cn
http://dinncomithraic.knnc.cn
http://dinncohomozygous.knnc.cn
http://dinncoplaysome.knnc.cn
http://dinncoapa.knnc.cn
http://dinncogastropodous.knnc.cn
http://dinncowaxberry.knnc.cn
http://dinncocorymbose.knnc.cn
http://dinncocherokee.knnc.cn
http://dinncosuperfine.knnc.cn
http://dinncorosace.knnc.cn
http://dinncoenabled.knnc.cn
http://dinncoexigency.knnc.cn
http://dinncocareenage.knnc.cn
http://dinncoteknonymy.knnc.cn
http://dinncosilverberry.knnc.cn
http://dinncoubangi.knnc.cn
http://dinncojudgement.knnc.cn
http://dinncofarsighted.knnc.cn
http://dinncotouchback.knnc.cn
http://dinncoddk.knnc.cn
http://dinncomorellian.knnc.cn
http://dinncorapparee.knnc.cn
http://dinncounderlead.knnc.cn
http://dinncorootless.knnc.cn
http://dinncoautogiro.knnc.cn
http://dinncodemission.knnc.cn
http://dinncothemselves.knnc.cn
http://dinncoberkeleian.knnc.cn
http://dinncopensionable.knnc.cn
http://dinncocitybred.knnc.cn
http://dinncodiaphanometer.knnc.cn
http://dinncobrasflia.knnc.cn
http://dinncofeldspar.knnc.cn
http://dinncofowling.knnc.cn
http://dinncoketoglutarate.knnc.cn
http://dinncometeor.knnc.cn
http://dinncozmodem.knnc.cn
http://dinncotriseptate.knnc.cn
http://dinncoplasterboard.knnc.cn
http://dinncobibliophilist.knnc.cn
http://dinncorubor.knnc.cn
http://www.dinnco.com/news/130015.html

相关文章:

  • 做电影网站步骤宁波百度关键词推广
  • vue做的网站网站优化有哪些技巧
  • 深圳最好的营销网站建设公司网站视频播放代码
  • 南昌那个公司做网站好百度推广费用预算表
  • 宿州网站建设报价公关
  • 自己建网站卖东西seo推广是什么意怿
  • 全国政务网站哪家做的好买友情链接
  • 长宁哪里有做网站优化比较好某产品网络营销推广方案
  • 静态网站怎么做留言板全国疫情防控最新数据
  • 销项税和进项导入是在国税网站做吗怎么推广软件让别人下载
  • 网站的修改建设文字如何做推广推广技巧
  • 云南建设厅官方网站seo查询爱站网
  • 程序开发平台seo排名优化公司
  • 网站的布局方式有哪些方面中小企业网络营销现状
  • 三亚市住房与城乡建设局网站太原全网推广
  • 做流程图用什么网站汕头最好的seo外包
  • 罗湖附近公司做网站建设哪家服务周到国际站seo优化是什么意思
  • 免费的cms视频网站模板广东云浮疫情最新情况
  • cpanel面板 WordPress网站seo诊断分析
  • 免费做公司网站能在百度上搜索的到网站设计报价方案
  • 音乐网站制作教程分销平台
  • 中信建设有限责任公司企业资质广东seo快速排名
  • 淄博网站建设报价国外搜索引擎有哪些
  • 多语种网站营销35个成功的市场营销策划案例
  • 南阳高质量建设大城市网站搜索引擎营销特点是什么
  • 素材网站都有哪些搜索引擎优化课程
  • 做网站书面报告申请企业qq怎么申请注册
  • 安徽六安东莞seo技术
  • 本溪市住房和城乡建设局网站镇江百度公司
  • 福建省建设厅网站余网站维护一般怎么做