13.5.1 面向对像的模块(ObjectOriented Module)_虽然很晚,但还是得更新 简单

//13.5.1 面向对像的模块(Object-Oriented Module)
//13.5.2 Sony类层次结构(Class Sony Hierarchy)
//纯平(PureFlat) 等离子(Plasma) 液晶(Liquid Crystal)
//例如,若等离子类中有公共操作"等离子图像变换",我们在fn函数中获得了Sony类指针,并确认为等离子29英寸电视机,于是进行以下操作
/*
void fn(Sony* sp){

B29* b = dynamic_cast<B29*>(sp);
if(b) b->切换频道(); //ok

Plasma* p = dynamic_cast<Plasma*>(b);
if(p) p->等离子图像变换(); //ok
sp->等离子图像变换(); //错
}
//等离子类中的操作只有在保护继承的对像中以成员函数的形式访问,如转换频道成员函数中访问"等离子图像变换"
时才是允许的,而外部使用却被禁止

//Sony类定义(Defining Class Sony)

sony.h ------------电视的基类
inch29.h------------29英寸电视基类
inch34.h------------34英寸电视基类
pureflat.h----------纯平电视
plasma.h------------等离子
liquidcrystal.h-----液晶电视

a29.h-----------29英寸纯平电视
b29.h-----------29英寸等离子
c29.h-----------29英寸液晶

a34.h-----------34英寸纯平电视
b34.h-----------34英寸等离子
c34.h-----------34英寸液晶

//13.5.4 CreateSony类层次结构 (Class CreateSony Hierarchy)

createsony.h 创建Sony信息

13.5.5 CreateSony的子类定义(Defining Class CreateSony)
pureflatcreate.h-------纯平的创建类

//13.5.6 应用编程(Application Programming)
*/

//Sony抽像编辑
#include <iostream>
#include "createsony.h"
#include "sony.h"
enum Technology{PUREFLAT,PLASMA, LIQUIDCRYSTAL};

//这里是显示各种显示器的说明
void fn(Sony* s)
{
   //这里有错误
   s->adjustVolume();
   s->switchChannel();
}
//传入一下CreateSony的指针,然后进行显示器的创建
void createSonyObject(CreateSony* sp)
{
   //创建一个29的显示器
   Sony* s29 = createSonyInch29(sp);
   //创建一个34的显示器
   Sony* s34 = createSonyInch34(sp);
   fn(s29);
   fn(s34);
   delete s29;
   delete s34;
}
int main()
{
	//CreateSony* sp; 实例化一下CreateSony类型的sp指针地址
	//用createCreateSony函数创建一个指定类型的显示器,并返回CreateSony*指针类型
	if(CreateSony* sp = createCreateSony(LIQUIDCRYSTAL)){
	     //然后开始创建这个显示器的各种英寸的型号
		 createSonyObject(sp);
		 delete sp;
	}
	system("pause");
    return 0;
}

  

sony.h  ------------电视的基类

#ifndef HEADER_SONY
#define HEADER_SONY
//定义两个基本的操作函数,分别为纯虚函数
//声明一个析构函数
class CreateSony; //前向声明
class Sony{
public:
	//virtual void 切换频道()=0;
	//virtual void 调节音量()=0;
	virtual void adjustVolume()=0;
	virtual void switchChannel()=0;

	virtual ~Sony(){}
};
//声明两个函数,分别返回Sony*类型,传入参数为CreateSony类型
Sony* createSonyInch29(CreateSony*);
Sony* createSonyInch34(CreateSony*);
#endif

  

inch29.h------------29英寸电视基类
inch34.h------------34英寸电视基类

#ifndef HEADER_INCH29
#define HEADER_INCH29
#include "sony.h"
//29英寸基类
class Inch29 : public Sony{ };

#endif

#ifndef HEADER_INCH34
#define HEADER_INCH34
#include "sony.h"

//34英寸基类
class Inch34 : public Sony{ };


#endif;

  

pureflat.h----------纯平电视
plasma.h------------等离子
liquidcrystal.h-----液晶电视

#ifndef HEADER_PLASMA
#define HEADER_PLASMA
#include <iostream>

//等离子电视基类
class Plasma{
public:
	virtual void drawgraph(){ std::cout<<"I am 等离子 drawgraph\n";}
	virtual void specialForPureflat(){ std::cout<<"I am 等离子 SpecialForPureflat\n";}
	~Plasma(){}
};
#endif;

#ifndef HEADER_PUREFALT
#define HEADER_PUREFALT
#include <iostream>

//纯平电视类
class Purefalt
{
public:
	virtual void drawgraph(){ std::cout<<"I am 纯平 drawgraph\n";}
	virtual void specialForPureflat(){ std::cout<<"I am 纯平 SpecialForPureflat\n";}
	~Purefalt(){}
};
#endif;

#ifndef HEADER_LIQUIDCRYSTAL
#define HEADER_LIQUIDCRYSTAL
#include <iostream>
//液晶电视基类
class LiquidCrystal{

public:
	virtual void drawgraph(){ std::cout<<"I am 液晶 drawgraph\n";}
	virtual void specialForPureflat(){ std::cout<<"I am 液晶 SpecialForPureflat\n";}
	~LiquidCrystal(){}
};
#endif;

  

a29.h-----------29英寸纯平电视
b29.h-----------29英寸等离子
c29.h-----------29英寸液晶

#ifndef HEADER_A29
#define HEADER_A29
#include "purefalt.h"
#include "inch29.h"
#include <iostream>

//公有继承Inch29,保护继承Pureflat
class A29 : public Inch29, protected Purefalt
{
public:
	void adjustVolume(){ std::cout<<"纯平电视29英寸 Pureflat29 AdjustVolume\n"; }
	void switchChannel(){ std::cout<<"纯平电视29英寸 Pureflat29 SwitchChannel\n";}
	~A29(){}
};
#endif;

#ifndef HEADER_B29
#define HEADER_B29
#include "plasma.h"
#include "inch29.h"
#include <iostream>
class B29 : public Inch29, protected Plasma{

public:
	void adjustVolume(){ std::cout<<"等离子电视29英寸 Pureflat29 AdjustVolume\n"; }
	void switchChannel(){ std::cout<<"等离子电视29英寸 Pureflat29 SwitchChannel\n";}
	~B29(){}
};
#endif;

#ifndef HEADER_C29
#define HEADER_C29
#include "liquidcrystal.h"
#include "inch29.h"
#include <iostream>

class C29 : public Inch29, protected LiquidCrystal
{
public:
	void adjustVolume(){ std::cout<<"液晶电视29英寸 Pureflat29 AdjustVolume\n"; }
	void switchChannel(){ std::cout<<"液晶电视29英寸 Pureflat29 SwitchChannel\n";}
	~C29(){}
};
#endif

  

a34.h-----------34英寸纯平电视
b34.h-----------34英寸等离子
c34.h-----------34英寸液晶

#ifndef HEADER_A34
#define HEADER_A34
#include "purefalt.h"
#include "inch34.h"
#include <iostream>
class A34 : public Inch34, protected Purefalt
{
public:
	void adjustVolume(){ std::cout<<"纯平电视34英寸 Pureflat34 AdjustVolume\n"; }
	void switchChannel(){ std::cout<<"纯平电视34英寸 Pureflat34 SwitchChannel\n";}
	~A34(){}

};
#endif;

#ifndef HEADER_B34
#define HEADER_B34
#include "plasma.h"
#include "inch34.h"
#include <iostream>
class B34 : public Inch34, protected Plasma
{
public:
	void adjustVolume(){ std::cout<<"等离子电视34英寸 Pureflat34 AdjustVolume\n"; }
	void switchChannel(){ std::cout<<"等离子电视34英寸 Pureflat34 SwitchChannel\n";}
	~B34(){}

};
#endif;

#ifndef HEADER_C34
#define HEADER_C34
#include "liquidcrystal.h"
#include "inch34.h"
#include <iostream>
class C34 : public Inch34, protected LiquidCrystal
{
public:
	void adjustVolume(){ std::cout<<"液晶电视34英寸 Pureflat34 AdjustVolume\n"; }
	void switchChannel(){ std::cout<<"液晶子电视34英寸 Pureflat34 SwitchChannel\n";}
	~C34(){}

};
#endif;

  createsony.h 创建Sony信息

#ifndef HEADER_CREATESONY
#define HEADER_CREATESONY
#include "sony.h"  //引入sony.h类

class CreateSony
{
public:          
	virtual Sony* createInch29() =0;
	virtual Sony* createInch34() =0;
	virtual ~CreateSony(){};
	//定义了两个纯虚函数createInch29,createInch34
};
CreateSony* createCreateSony(int); //在createsony.cpp实现,主要是根据悉int型来创建不同的sony
CreateSony* createPureflat();      //pureflatcrate.cpp中实现 创建纯平电视
CreateSony* createPlasma();        //在于plasmacreate.cpp中实现,创建等离子
CreateSony* createLiquidCrystal(); //在liquidcrystalcreate.cpp中实现,创建液晶
#endif;


#include "createsony.h"

//这个crateSonyInch29是在sony.h最基类中声明,在这里对该函数进行了定义
Sony* createSonyInch29(CreateSony* sp)
{
	return sp->createInch29();
}
//这个crateSonyInch34是在sony.h最基类中声明,在这里对该函数进行了定义
Sony* createSonyInch34(CreateSony* sp)
{
	return sp->createInch34();
}

//该函数声明在createsony.h中声明
//这里是根据int a 来判断创建的是什么电视机类型,纯平,等离子 液晶
CreateSony* createCreateSony(int a)
{
	switch(a){
		case 0: return createPureflat();
		case 1: return createPlasma();
		case 2: return createLiquidCrystal();
		default: return 0;
	}     
}

  

pureflatcreate.h-------纯平的创建类
plasmacreate.h---------等离子的创建类
liquidcrystalcreate.h--液晶的创建类

#ifndef HEADER_PUREFLATCREATE
#define HEADER_PUREFLATCREATE
#include "createsony.h"

class PureflatCreate : public CreateSony
{
public:
	Sony* createInch29(); //这里创建29的纯平电视
	Sony* createInch34(); //这里创建43的纯平电视
	~PureflatCreate(){}
};
#endif;

#include "pureflatcreate.h"
#include "a29.h"
#include "a34.h"

Sony* PureflatCreate::createInch29()
{
     return new A29(); //
}
Sony* PureflatCreate::createInch34()
{
    return new A34();
}
//这个函数是在createsony.cpp中声明的
CreateSony* createPureflat(){ return new PureflatCreate(); }


#ifndef HEADER_PLASMACREATE
#define HEADER_PLASMACREATE
#include "createsony.h"

class PlasmaCreate : public CreateSony
{
public:
	Sony* createInch29(); //创建B29对象
	Sony* createInch34(); //创建B34对象
	~PlasmaCreate(){};
};
#endif;

#include "plasmacreate.h"
#include "b29.h"
#include "b34.h"

Sony* PlasmaCreate::createInch29()
{
   return new B29();
}
Sony* PlasmaCreate::createInch34()
{
   return new B34();
}
CreateSony* createPlasma(){ return new PlasmaCreate(); }

#ifndef HEADER_LIQUIDCRYSTALCREATE
#define HEADER_LIQUIDCRYSTALCREATE
#include "createsony.h"

class LiquidCrystalCreate : public CreateSony
{
public:
	//Sony* createInch29();
	//Sony* createInch34();
	  Sony* createInch29(); //创建C29对象
	  Sony* createInch34(); //创建C34对象
	  ~LiquidCrystalCreate(){}; //操这里忘加括号了
};
#endif;

#include "liquidcrystalcreate.h"
#include "c29.h"
#include "c34.h"

/**/Sony* LiquidCrystalCreate::createInch29()
{
    return new C29();
}
Sony* LiquidCrystalCreate::createInch34()
{
    return new C34();
}

CreateSony* createLiquidCrystal(){ return new LiquidCrystalCreate(); }

  

原文地址:https://www.cnblogs.com/xiangxiaodong/p/2356635.html