#include "stdafx.h"
# include<iostream>
#include<ostream>
#include<istream>
class Monster
{
public:
virtual void show() = 0;
};
class SillyMonster : public Monster
{
public:
virtual void show()
{
std::cout<<"i'm silly monster\n";
}
};
class BadMonster : public Monster
{
public:
virtual void show()
{
std::cout<<"i'm bad monster\n";
}
};
class MonsterCreator
{
public:
virtual Monster *create() = 0;
};
class SillyMonsterCreator : public MonsterCreator
{
public:
virtual SillyMonster *create() { return new SillyMonster; }
};
class BadMonsterCreator : public MonsterCreator
{
public:
virtual BadMonster *create() { return new BadMonster; }
};
Monster* f(MonsterCreator &creator)
{
Monster *m = creator.create();
return m;
}
int _tmain(int argc, _TCHAR* argv[])
{
SillyMonsterCreator smc;
BadMonsterCreator bmc;
// let's create a silly monster
Monster* Monster1= f(smc);
Monster1->show();
// let's create a bad monster
Monster* Monster2= f(bmc);
Monster2->show();
int x(0);
std::cin>>x;
return 0;
}
在C++中不存在virtual constructor, 这里所说的virtual constructor指的是作用和virtual constructor类似的函数,根据不同的输入构造不同的对象。
在以上代码中,不同的怪兽派生于怪兽基类Monster,不同的怪兽生成器派生于怪兽生成基类MonsterCreator。
在怪兽生成器中利用虚函数,让不同的生成器生成不同的怪兽。
函数f就实现了virtual constructor。
参考了http://blog.sina.com.cn/s/blog_77402b360100xapy.html
以及 《More effective C++》