首先:我已阅读并且我现在知道在C++中虚拟模板成员函数(但是?)是不可能的.解决方法是将类作为模板,然后在member-function中使用template-argument.
但是在OOP的上下文中,我发现如果该类实际上是一个模板,下面的例子将不会非常"自然".请注意,代码实际上不起作用,但gcc-4.3.4报告:error: templates may not be ‘virtual’
#include <iostream>
#include <vector>
class Animal {
public:
template< class AMOUNT >
virtual void eat( AMOUNT amount ) const {
std::cout << "I eat like a generic Animal." << std::endl;
}
virtual ~Animal() {
}
};
class Wolf : public Animal {
public:
template< class AMOUNT >
void eat( AMOUNT amount) const {
std::cout << "I eat like a wolf!" << std::endl;
}
virtual ~Wolf() {
}
};
class Fish : public …Run Code Online (Sandbox Code Playgroud) 我正在编写一个游戏引擎,我为对象设置了这个类:
class SceneManager //controls everything in the "world" game
{
public:
void Add(SceneObject* object); //adds to the vector
private:
vector<SceneObject*> _worldObjects; //the vector that contains all of them
}
Run Code Online (Sandbox Code Playgroud)
我在游戏上工作的所有类都继承自SceneObject:
class SceneObject
{
public:
virtual void Draw() = 0;
}
class Image : public SceneObject
{ }
class Sprite : public SceneObject
{ }
class Model3D : public SceneObject
{ }
Run Code Online (Sandbox Code Playgroud)
所以我知道我可以为我的向量中的所有对象调用Draw().但我一直致力于优化,我正在尝试摆脱所有继承和虚函数,而是使用组合,因为它们无法内联,并且在每个对象上执行时似乎是一个主要的性能问题基础.
我正在寻找一些C++技术,我可以使用它来在我的向量中存储一堆SceneObjects,然后在它上面调用Draw()并正确绘制与之相关的对象.这也适用于我用作虚拟的Update()函数.
所以这段代码:
void SceneManager::Add(SceneObject* object)
{
_worldObjects.push_back(object);
}
void SceneManager::DrawTheWorld()
{
for(unsigned int i = 0; i < …Run Code Online (Sandbox Code Playgroud)