继承和虚函数无法编译(来自Head First DP)

时间:2013-03-20 13:43:10

标签: c++ design-patterns

我是Design Pattern的新手,我正在尝试(Head First Design Patterns)的第一个例子,但我正在尝试用C ++编写代码。我无法编译我的代码!我不知道为什么。这是我的代码。

#include <iostream>
using namespace std;

class QuackBehavior
{
public:
    virtual void quack();
    virtual ~QuackBehavior();
};
class Quack : public QuackBehavior
{
public:
    void quack()
    {
        cout<<"Quacking"<<endl;
    }
};

class MuteQuack : public QuackBehavior
{
public:
    void quack()
    {
        cout<<"<<< Silence >>>"<<endl;
    }
};

class Squeak : public QuackBehavior
{
public:
    void quack()
    {
        cout<<"Squeak"<<endl;
    }
};

class FlyBehavior
{
public:
    virtual void fly();
    virtual ~FlyBehavior();
};

class FlyWithWings : public FlyBehavior
{
public:
    void fly()
    {
        cout<<"I'm flying"<<endl;
    }
};



class FlyNoWay : public FlyBehavior
{
public:
    void fly()
    {
        cout<<"I can't fly"<<endl;
    }
};

class Duck
{
public:
    FlyBehavior *flyBehavior;
    QuackBehavior *quackBehavior;

    void display();
    void performFly()
    {
        flyBehavior->fly();
    }
    void performQuack()
    {
        quackBehavior->quack();
    }

};

class MallardDuck : public Duck
{
public:
    MallardDuck()
    {
        quackBehavior = new Quack();
        flyBehavior = new FlyWithWings();
    }
};



int main()
{

    Duck *mallard = new MallardDuck;

    cout<<"Test"<<endl;

    mallard->performFly();
//  mallard->performQuack();

    return 0;
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您收到编译错误,因为您没有为类QuackBehavior和类FlyBehavior中的函数提供默认定义。 您可以提供默认实现或使函数纯虚拟。

进行以下两项更改,您的代码应该编译正常。

class QuackBehavior
{
      public:
          virtual void quack(){}
          virtual ~QuackBehavior(){}
};

class FlyBehavior
{
  public:
      virtual void fly(){}
      virtual ~FlyBehavior(){}
};

OR

class FlyBehavior
{
  public:
      virtual void fly() = 0;
};

class QuackBehavior
{
  public:
      virtual void quack() = 0;
};