C ++上的战略模式

时间:2018-04-03 15:21:30

标签: c++ design-patterns

我正在尝试使用HeadFirst从java到C ++的策略模式的端口示例

#include "iostream" using namespace std;
class IFlyBehavior
{
public:
    virtual void fly() = 0;
};

class FlyWithWings : public IFlyBehavior
{
public:
    void fly() override
    {
        cout << "fly!";
    }
};
class FlyNoWay : public IFlyBehavior
{
public:
    void fly() override
    {
        cout << "no fly!";
    }
};

class IQuackBehavior
{
public:
    virtual void quack() = 0;
};
class Quack : public IQuackBehavior
{
public:
    void quack() override
    {
        cout << "Quack!";
    }
};
class Squeak : public IQuackBehavior
{
public:
    void quack() override
    {
        cout << "Squeak!";
    }
};
class MuteQuack : public IQuackBehavior
{
public:
    void quack() override
    {
        cout << "Can't quack";
    }
};

class Duck : public IFlyBehavior, IQuackBehavior
{
public:
    FlyWithWings* fly_behavior;
    Quack* quack_behavior;
    void swim()
    {
        cout << "Swim!";
    }
    virtual void display() = 0;
    void performQuack()
    {
        quack_behavior->quack();
    }
    void performFly()
    {
        fly_behavior->fly();
    }
};

class MallardDuck : public Duck
{
public:
    MallardDuck()
    {
        quack_behavior = new Quack();
        fly_behavior = new FlyWithWings();
    }

    void display() override
    {
        cout << "Mallard!";
    }
};
class RedheadDuck : public Duck
{
public:
    void display() override
    {
        cout << "RedHead!";
    }
};
class DecoyDuck : public Duck
{
public:
    void display() override
    {
        cout << "DecoyDuck!";
    }
};
class RubberDuck : Duck
{
public:
    void display() override
    {
        cout << "RubberDuck!";
    }
};


int main(int argc, char* argv[])
{
    Duck* md = new MallardDuck;
    md->performFly();
    md->performFly();
    return 0;
}

但是我收到了错误:  不允许使用E0322抽象类类型“MallardDuck”的对象:Duck d:\ Code \ CODE \ C ++ \ Duck \ Duck \ Source.cpp 119 看起来编译器看不到实现的类,为什么会发生这种情况?关于它的任何想法?我该怎么做?

2 个答案:

答案 0 :(得分:6)

您无法实例化MallardDuck,因为MallardDuckDuck,据称可以实现IQuackBehavior接口,但无法覆盖void Quack()。同样的飞行行为。

我建议您不要试图&#34;翻译&#34; Java到C ++;它们是完全不同的语言,应该这样对待。 Here are some good books for learning the language you're actually using

答案 1 :(得分:0)

MallardDuck继承了Duck,它继承自抽象类IFlyBehaviorIQuackBehavior。但是没有地方覆盖那些抽象类中的抽象函数。

相反,你似乎有一个奇怪的混合继承与封装。