思勤无邪

上学时,因我年龄最小,个头也最小,上课时,就像大猩猩堆里的猴一般。如今,这猴偶尔也把最近的一些情况写在这里。

   :: 首页 :: 联系 :: 聚合  :: 管理
  132 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks

公告

     吾日常三省吾身,曰思、曰勤、曰无邪。

积分与排名

  • 积分 - 157338
  • 排名 - 142

最新随笔

最新评论

阅读排行榜

评论排行榜

看Ruminations on C++ 的时候照着写的,简单的框架,留作备份吧。

// 代理类 Demo
// 将继承和容器共用,迫使我们要处理两个问题:
// 控制内存分配和把不同类型的对象放入同一个容器中。
// 代理类的每个对象都代表另一个对象,该对象可以是
// 位于一个完整继承层次中的任何类的对象。通过在容器中
// 用代理对象而不是对象本身来解决以上两个问题

#include 
<process.h>        // system()
#include <iostream>
using namespace std;

// 所有交通工具的基类
class Vehicle
{
public:
    
virtual void start() = 0;
    
// 动态复制
    virtual Vehicle* copy() const = 0;
    
// 虚析构函数
    virtual ~Vehicle() {}
}
;

// 交通工具的代理类
class VehicleSurrogate
{
public:
    
// 无参构造函数,用于创建数组
    VehicleSurrogate();
    
// 用Vehicle 及其派生类构造
    VehicleSurrogate(const Vehicle&);
    
~VehicleSurrogate();
    
// 拷贝及赋值
    VehicleSurrogate(const VehicleSurrogate&);
    VehicleSurrogate
& operator=(const VehicleSurrogate&);

    
// Vehicle 的方法
    void start();
private:
    Vehicle
* p;
}
;

VehicleSurrogate::VehicleSurrogate() : p(
0{}

VehicleSurrogate::VehicleSurrogate(
const Vehicle& v) : p(v.copy()) {}

VehicleSurrogate::VehicleSurrogate(
const VehicleSurrogate& vs) 
: p(vs.p 
? vs.p->copy() : 0{}

VehicleSurrogate 
& VehicleSurrogate::operator =(const VehicleSurrogate& vs)
{
    
if (p != vs.p)
    
{
        delete p;
        p 
= vs.p ? vs.p->copy() : 0;
    }

    
return *this;
}


VehicleSurrogate::
~VehicleSurrogate() { delete p; }

void VehicleSurrogate::start()
{
    
if (p)
        p
->start();
    
else
        cout 
<< "Error" << endl;
}


class RoadVehicle : public Vehicle
{
public :
    
void start()
    
{
        cout 
<< "RoadVehicle start." << endl;
    }

    Vehicle
* copy() const
    
{
        
return (Vehicle*new RoadVehicle(*this);
    }

    
~RoadVehicle()
    
{
    }

}
;

class AutoVehicle : public RoadVehicle
{
public :
    
void start()
    
{
        cout 
<< "AutoVehicle start." << endl;
    }

    Vehicle
* copy() const
    
{
        
return (Vehicle*new AutoVehicle(*this);
    }

    
~AutoVehicle()
    
{
    }

}
;

void main()
{
    VehicleSurrogate pa[
3];
    RoadVehicle
* prv = new RoadVehicle();
    pa[
0= *prv;
    delete prv;
    pa[
1= AutoVehicle();
    pa[
2= RoadVehicle();
    pa[
0].start();
    pa[
1].start();
    pa[
2].start();
    system(
"pause");
}
posted on 2007-03-29 22:44 思勤无邪 阅读(821) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理