[英]C++ Inheritance: Calling subclass function of template
我有一个模板化类和一个模板化类的子类,以便以不同的方式实现功能。 因为我想保持拥有多个子类的灵活性,所以我不直接存储子类本身。 在Java中,类似我想做的事情可以工作,但显然在C ++中却行不通。
template<class Res> class Loader {
public:
Res* loadFromFile(std::string filePath);
};
template<class Res> inline Res* Loader<Res>::loadFromFile(std::string filePath){return NULL;}
子类:
class TextureLoader : public Loader<sf::Texture> {
public:
sf::Texture* loadFromFile(std::string path);
};
inline sf::Texture* TextureLoader::loadFromFile(std::string path){
sf::Texture* texture = new sf::Texture();
texture->loadFromFile(path);
return texture;
}
在另一个类的某个地方,我存储了一个Loader的实例:
Loader<Res> * loader;
我的问题是,即使将TextureLoader实例分配给该加载程序变量,也仅会调用超类函数,而不会调用实际实现的子类函数。 如何在保持多个装载程序的灵活性的同时调用subclas函数?
您可能不想要继承-看起来您可能想要特殊化:
template<>
sf::Texture* Loader<sf::Texture>::loadFromFile(std::string path) {...}
现在只需使用Loader<sf::Texture>
,然后再计划使用TextureLoader
。 或者,将后者键入到前者。
为了进行动态调度,您需要在基类中声明虚拟的成员函数。 您还需要将析构函数声明为虚拟的,以确保在通过基类类型删除派生类时正确清理了派生类。
template<class Res> class Loader {
public:
virtual ~Loader() [}
virtual Res* loadFromFile(std::string filePath);
};
您的功能永远不会被标记为虚拟的。 就是说,您应该真正使它抽象化,因为不重写它就没有用:
template<class T> class Loader
{
public:
virtual T* LoadFromFile(const std::string& filePath) = 0;
virtual ~Loader() {}
};
class TextureLoader : public Loader<sf::Texture>
{
public:
virtual sf::Texture* LoadFromFile(const std::string& filePath);
{
sf::Texture* texture = new sf::Texture();
texture->loadFromFile(path);
return texture;
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.