我有以下类(class):
class Box{...};
class MyBox : public Box{...};
和模板:
template <type T>
class ObjectManager{...};
我在其他类(class)中使用的:
class Engine{
ObjectManager<Box> * manager = nullptr;
...
};
然后我扩展(实现)Engine
界面:
class MyEngine : public Engine{...}
在那个实现中(不是更早!)我知道 manager
应该是这样的:
MyEngine::MyEngine(){
manager = new ObjectManager<MyBox>();
}
但是由于类型冲突(ObjectManager<Box>
和 ObjectManager<MyBox>
之间的转换),这给了我一个错误,即使是 MyBox
继承自 Box
.
有什么办法解决这个问题吗? 我不想修改 Box
, MyBox
, ObjectManager
和 Engine
类。
最佳答案
模板化Engine,然后继承MyEngine,Engine携带你想要的Box的模板实例。像这样:(http://codepad.org/SZMSbCRB)
#include <iostream>
using namespace std;
class Box{
};
class MyBox : public Box{
};
template <typename T>
class ObjectManager{
};
template <typename T>
class Engine{
public:
ObjectManager<T*> * manager;
};
class MyEngine : public Engine<MyBox>{
public:
MyEngine(){
manager = new ObjectManager<MyBox*>();
cout<<"myEngine created"<<endl;
}
};
int main() {
MyEngine eng = MyEngine();
return 0;
}
这里的好处是,如果明天您创建一个名为 MyBox2 的新 Box 并想为其创建一个自定义引擎 MyEngine2,只需继承 MyEngine : public Engine <MyBox2>
.只要确保处理好类型转换即可。
据我所知,在 Java 中,您可以将 Engine 声明为类似 Engine<extends T>
的内容它允许您使用提供的模板 T 的任何子类型实例化 Engine。这是一种更安全、更好的方法,但我不知道 C++ 是否提供类似的东西。
希望对您有所帮助。
关于c++ - 模板基类型继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29867167/