c++ - 模板基类型继承

标签 c++ templates inheritance

我有以下类(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 , ObjectManagerEngine类。

最佳答案

模板化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/

相关文章:

c++ - 什么是 C++ 的好的 HTML 模板引擎?

c# - 从子类调用父类构造函数的正确方法

c++ - 如何将变换矩阵应用于 OpenCV 中的一个点?

c++ - 我如何通过 CMake(qt5_wrap_ui) 指定 Qt Designer Form 类的文件名

c++ - 如何在带有模板的函数中使用前向类声明?

javascript - 如何使用带有预加载数据的 JavaScript MVVM/MVC

java - 在子类中实现 clone()

c++ - 派生类如何在编译时无法解析其基类的成员?

c++ - 如何使用 cout 在 C++ 中打印 CStringList

c++ - 自定义异常类 - 奇怪的行为