1.构造与析构
1>SimUDuck.exe : fatal error LNK1120: 1 个无法解析的外部命令
错误原因:如果在cpp文件里对函数进行声明了,则在.h文件里进行函数声明时不能加{}。而如果没有声明,则必须加{}。
如:
class Duck
{
public:
Duck();
~Duck(){};
};
此例中构造函数在cpp文件中进行了声明。而析构函数未进行声明,所以需要加{}。
2.重复定义
为避免重复定义,在需要引用的文件中一般会加上如下语句:
#ifndef _fly_
#define _fly_
{函数主体}
#endif
设计原则:一般要多用组合,少用继承。
组合:把每组不同的行为想象成一个算法族,在我们需要构造的基类中直接加入算法族以减少程序开发时间。即复用。
3.虚函数的使用
例程:
FlyBehavior.h
class FlyBehavior
{
public:
FlyBehavior();
virtual void fly(){};
};
class FlyWithWings:public FlyBehavior{
void fly();
};
class FlyNoWay :public FlyBehavior{
void fly();
};
class FlyRocketPowered :public FlyBehavior{
void fly();
};
FlyBehavior.cpp
#include<iostream>
#include "FlyBehavior.h"
using namespace std;
FlyBehavior::FlyBehavior()
{
}
void FlyWithWings::fly(){
cout << "i can fly" << endl;
}
void FlyNoWay::fly(){
cout << "i can't fly" << endl;
}
void FlyRocketPowered ::fly(){
cout << "I'm flying with a rocket!" << endl;
}
Duck.h
#include "FlyBehavior.h"
class Duck
{
public:
Duck();
void performFly();
public:
FlyBehavior* flyBehavior;
};
Duck.cpp
#include "Duck.h"
#include<iostream>
using namespace std;
Duck::Duck()
{
}
void Duck::performFly(){
flyBehavior->fly();
}
MallardDuck.h
#include "Duck.h"
class MallardDuck :public Duck
{
public:
MallardDuck();
};
MallarDuck.cpp
#include "MallardDuck.h"
MallardDuck::MallardDuck()
{
flyBehavior = new FlyWithWings();
}
说明:先构造行为算法并对其进行封装(用虚函数使其成为接口),然后在主体类中对其进行引用,最后在应用类中根据需要使用其多态性。