Ben*_*Ben 0 c++ inheritance interface
在C++中,我如何声明一个接口,我可以使用它,如下所示:
/** Enemy "Interface" */
Class Enemy {
Enemy();
virtual ~Enemy();
virtual void doStuff() = 0;
};
/** Enemy of type 1 */
Class Enemy_type1 : public Enemy {
Enemy_type1();
virtual ~Enemy_type1();
virtual void doStuff() {
// different for every type of enemy
}
};
/** Add an enemy to EnemyManager */
void EnemyManager::addEnemy(Enemy * e) {
this->enemies.push_back(*e); // declared as vector<Enemy> enemies;
}
Run Code Online (Sandbox Code Playgroud)
首先,您必须(或至少希望)将构成您的界面的功能公开:
class Enemy {
public:
Enemy();
virtual ~Enemy();
virtual void doStuff() = 0;
};
Run Code Online (Sandbox Code Playgroud)
然后你将继承它(C++没有"接口"和"类"作为单独的概念).
class Emeny_type1 : public Enemy {
// ...
};
Run Code Online (Sandbox Code Playgroud)
最后,由于这些是多态类型,你需要创建一个指向敌人的指针集合,而不是实际的Enemy对象:
void EnemyManager::addEnemy(Enemy const *e) {
enemies.push_back(e);
}
Run Code Online (Sandbox Code Playgroud)
这确实引发了对象生存期和所有权问题(这些问题在Java中主要不是问题).当您添加一个项目到集合中,你需要确保它不被破坏,只要你要使用它,一旦你用它做(被破坏例如,当敌人被击败了,你可能想删除它).您需要决定EnemyManager是否要删除不再需要的敌人或其他一些代码.如果EnemyManager要删除它们,您可能需要(或想要)clone向您的Enemy界面添加一个函数,以便获取要添加到集合中的对象的副本.
编辑:根据您的评论,您不太确定如何使用您存储在集合中的指针的敌人"界面".幸运的是,这很简单,像这样:
for (int i=0; i<enemies.size(); i++)
enemies[i]->doStuff();
Run Code Online (Sandbox Code Playgroud)