CTurkeyAdapter到底是鸡还是鸭?

YXTS122 2017-01-11 05:52:26
#include<iostream> using namespace std; class CDuck { public: virtual ~CDuck(){} virtual void Quack()=0; virtual void Fly()=0; }; class CMallardDuck:public CDuck { public: void Quack() { cout<<"绿头鸭,呱呱叫。"<<endl; } void Fly() { cout<<"绿头鸭在飞行。"<<endl; } }; class CTurkey { public: virtual ~CTurkey(){} virtual void Gobble()=0; virtual void Fly()=0; }; class CWildTurkey:public CTurkey { public: void Gobble() { cout<<"野生火鸡,咕咕叫"<<endl; } void Fly() { cout<<"野生火鸡飞行距离短"<<endl; } }; class CTurkeyAdapter:public CTurkey { public: CTurkeyAdapter(CTurkey *pTurkey):m_pTurkey(pTurkey) { } void Quack() { m_pTurkey->Gobble(); } void Fly() { for (int i=0;i<5;i++) { m_pTurkey->Fly(); } } private: CTurkey *m_pTurkey; }; int main() { int nRetCode=0; CDuck *pDuck=new CMallardDuck(); CTurkey *pTurkey=new CWildTurkey(); CTurkey *pAdapter=new CTurkeyAdapter(pTurkey); cout<<"火鸡..."<<endl; pTurkey->Gobble(); pTurkey->Fly(); cout<<"\n鸭子..."<<endl; pDuck->Quack(); pDuck->Fly(); cout<<"\n火鸡适配器..."<<endl; pAdapter->Quack(); pAdapter->Fly(); return nRetCode; } 写成这样,报错: /data/data/com.n0n3m4.droidc/files/temp.c: In function 'int main()': /data/data/com.n0n3m4.droidc/files/temp.c:66:46: error: invalid new-expression of abstract class type 'CTurkeyAdapter' CTurkey *pAdapter=new CTurkeyAdapter(pTurkey); ^ compilation terminated due to -Wfatal-errors. 写成下面这样就可以运行了: #include<iostream> using namespace std; class CDuck { public: virtual ~CDuck(){} virtual void Quack()=0; virtual void Fly()=0; }; class CMallardDuck:public CDuck { public: void Quack() { cout<<"绿头鸭,呱呱叫。"<<endl; } void Fly() { cout<<"绿头鸭在飞行。"<<endl; } }; class CTurkey { public: virtual ~CTurkey(){} virtual void Gobble()=0; virtual void Fly()=0; }; class CWildTurkey:public CTurkey { public: void Gobble() { cout<<"野生火鸡,咕咕叫"<<endl; } void Fly() { cout<<"野生火鸡飞行距离短"<<endl; } }; class CTurkeyAdapter:public CDuck { public: CTurkeyAdapter(CTurkey *pTurkey):m_pTurkey(pTurkey) { } void Quack() { m_pTurkey->Gobble(); } void Fly() { for (int i=0;i<5;i++) { m_pTurkey->Fly(); } } private: CTurkey *m_pTurkey; }; int main() { int nRetCode=0; CDuck *pDuck=new CMallardDuck(); CTurkey *pTurkey=new CWildTurkey(); CDuck *pAdapter=new CTurkeyAdapter(pTurkey); cout<<"火鸡..."<<endl; pTurkey->Gobble(); pTurkey->Fly(); cout<<"\n鸭子..."<<endl; pDuck->Quack(); pDuck->Fly(); cout<<"\n火鸡适配器..."<<endl; pAdapter->Quack(); pAdapter->Fly(); return nRetCode; } PS:为什么给CTurkeyAdapter做变性手术,搞得男不男,女不女的?
...全文
210 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻夢之葉 2017-01-12
  • 打赏
  • 举报
回复
使用上错了,正确方法如下 CTurkeyAdapter *pAdapter=new CTurkeyAdapter(pTurkey); pAdapter->Quack(); pAdapter->Fly(); 接口适配器主要用于统一接口 对于一些你不便修改的的情况下(比如得不到源码,公有接口在别人的模块被太多使用不便修改) 比如你CTurkeyAdapter 适配器就是在你不能随意更改CTurkey的接口函数下 而你又想修改公用接口函数的名称,就多加了一层包装 void Quack() { m_pTurkey->Gobble(); } 说白了就是换个接口名称或者封装一组操作

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧