作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
尝试在 C++ 中使用多态性来解决问题。下面是两个基础抽象类,Duck
和 FlyingBehavior
,以及一系列继承类(这是基于 Head First Design Patterns).
// Define an abstract fly behaviour class
class FlyBehavior {
public:
virtual void fly() { cout << "No Flying Set!" << endl; }
};
class FlySwoop : public FlyBehavior {
public:
void fly() { cout << "Swoop Flying!" << endl; }
};
class CantFly : public FlyBehavior {
public:
void fly() { cout << "Can't Fly!" << endl; }
};
// Define an abstract Duck class
class Duck {
CantFly nf;
FlyBehavior *flyBehavior;
public:
Duck() { flyBehavior = &nf; }
void goFly() { flyBehavior->fly(); }
void setFlyBehavior(FlyBehavior *fb) { flyBehavior = fb; }
};
// Define a new Mallard Duck class
class MallardDuck : public Duck {
FlySwoop fb;
public:
MallardDuck(){ setFlyBehavior(&fb); }
};
// Define a new Rubber Duck class
class RubberDuck : public Duck {
CantFly fb;
public:
RubberDuck(){ setFlyBehavior(&fb); }
};
// Define a new Toilet Duck Class
class ToiletDuck : public Duck {};
int main(void) {
Duck *p;
MallardDuck mallardDuck;
RubberDuck rubberDuck;
ToiletDuck toiletDuck;
p = &mallardDuck;
p->goFly();
p = &rubberDuck;
p->goFly();
p = &toiletDuck;
p->goFly();
}
使用上面的代码我得到以下输出
Swoop Flying!
Can't Fly!
Can't Fly!
当我期待
Swoop Flying!
Can't Fly!
No Flying Set!
我是否以正确的方式处理这个示例(习惯于在 Java 中完成)?忍不住觉得我缺少一些基本的东西。我试图了解您如何从一个类中提取一个行为,将其放入另一个类,然后使用多态性来委托(delegate)给正确的行为。有没有更好的方法来解决上述问题?
嗯,也许这就是您使用多重继承的地方?
最佳答案
如果你改变
class Duck {
CantFly nf;
FlyBehavior *flyBehavior;
public:
Duck() { flyBehavior = &nf; }
void goFly() { flyBehavior->fly(); }
void setFlyBehavior(FlyBehavior *fb) { flyBehavior = fb; }
};
到
class Duck {
FlyBehavior nf;
FlyBehavior *flyBehavior;
public:
Duck() { flyBehavior = &nf; }
void goFly() { flyBehavior->fly(); }
void setFlyBehavior(FlyBehavior *fb) { flyBehavior = fb; }
};
您的代码将产生所需的输出。
在当前版本的代码中,ToiletDuck
编译器生成的默认构造函数调用 Duck
类的默认构造函数,该类将 nf
设置为指向到 CantFly
类的一个实例。当然,它会打印 Can't fly
。
关于c++ - C++ 中的多态性和类抽象示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26639244/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!