开始学习设计模式,卡在书的第一章。这本书是为 javaist 编写的,但我决定将代码翻译成 C++。
#include <iostream>
using namespace std;
// interfaces
class FlyBehavior
{
public:
virtual void fly() = 0;
};
class QuackBehavior
{
public:
virtual void quack() = 0;
};
// Flying
class FlyWithWings
: FlyBehavior
{
public:
virtual void fly()
{
cout << "I'm flying" << endl;
}
};
class FlyNoWay
: FlyBehavior
{
public:
virtual void fly()
{
cout << "I can't fly" << endl;
}
};
// Quacking
class Quack
: QuackBehavior
{
public:
virtual void quack()
{
cout << "Quack!" << endl;
}
};
class MuteQuack
: QuackBehavior
{
public:
virtual void quack()
{
cout << "Silence..." << endl;
}
};
class Squeak
: QuackBehavior
{
public:
virtual void quack()
{
cout << "Squeak!" << endl;
}
};
class Duck
{
public:
FlyBehavior *flyBehavior;
QuackBehavior *quackBehavior;
virtual void display() = 0;
virtual void performFly()
{
flyBehavior->fly();
}
virtual void performQuack()
{
quackBehavior->quack();
}
void swim()
{
cout << "All ducks float" << endl;
}
};
class MallardDuck
: Duck
{
public:
MallardDuck()
{
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
virtual void display()
{
cout << "Typical mallard duck" << endl;
}
};
int main(int argc, char *argv[])
{
Duck *pMallard = new MallardDuck();
pMallard->performFly();
pMallard->performQuack();
return 0;
}
我不太明白为什么你不能将 from 转换FlyBehavior*
为FlyWithWings*
. 我知道从接口创建对象是不可能的,但是我把它转换成某个类的对象,就好像是。
编译错误:
\main.cpp:97: error: C2243: cast: 转换“FlyWithWings *”到“FlyBehavior *”存在但不可用
\main.cpp:98: error: C2243: cast: 从“Quack *”到“QuackBehavior *”的转换存在但不可用
\main.cpp:110: error: C2243: cast: 转换“MallardDuck *”到“Duck *”存在但不可用
正如问题的评论中已经指出的那样,类型转换需要公共继承。
类型条目:
相当于
要启用类型转换,您需要指定公共继承:
如果改为
class
使用它struct
,则默认继承就会public
存在,问题就不会发生。