c++ - C++ 中的多态性和类抽象示例

标签 c++ delegates polymorphism abstract-class

尝试在 C++ 中使用多态性来让我头脑清醒。下面是两个基本抽象类,DuckFlyingBehavior,以及一系列继承类(这是基于 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/

相关文章:

ios - 如何在从主函数返回值之前等待委托(delegate)函数完成

c++ - 我正在尝试重载运算符<<

c++ - 部分特化中模板模板参数内的可变参数模板参数

c++ - C++中函数作为变量的语义是什么

c++ - gRPC - C++ 异步 HelloWorld 客户端示例不异步执行任何操作

ios - 如何在另一个选项卡的 View Controller 中为协议(protocol)设置委托(delegate)?

ios - 委托(delegate)仍然为零

c++ - 使用继承规避 switch 语句

c++ - 如果我只有基类指针,如何使用派生类?

c++ - 读、写和 as_bytes 函数