試圖在C++中使用多態性讓我的腦袋變得圓滿。下面是兩個基本抽象類,Duck
和FlyingBehavior
,以及一系列繼承類(這是基於第一章設計模式)的第一章。C++中的多態性和類抽象示例
// 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中這樣做) ?不禁覺得我失去了一些根本性的東西。我試圖理解你如何從類中提取行爲,將其放入另一個類中,然後使用多態性委託給正確的行爲。有沒有更好的方法來解決上述問題?
嗯,或許你在這裏使用多重繼承呢?
噢,當然是!在更一般的說明中,這種使用C++中的典型多態和委託?我對Java很有用,所以我可能會試圖以一種不適合C++的方式來實現它。真的很感激任何簡短的想法。 – 2014-10-29 20:08:23
@JamesB我會說這很好,因爲在C++中有很多方法可以做同樣的事情,並且選擇使用哪一種方法。 – kraskevich 2014-10-29 20:14:03