构造函数和虚函数的使用


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();
}

说明:先构造行为算法并对其进行封装(用虚函数使其成为接口),然后在主体类中对其进行引用,最后在应用类中根据需要使用其多态性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值