假设我有一个模板类,例如:
template <class type, size>
class myTemplate
我有一个抽象的基类:
class myDataType
和各种派生类
class subDataType1 : public myDataType
class subDataType2 : public myDataType
...
class subDataTypeN : public myDataType
我想做的是打电话给
myTemplate<myDataType, size> myObject;
但是,这显然是行不通的,因为在模板内部,我将实例化一个抽象类的对象。基本上,我希望模板可以与我的两个派生类一起使用,但是我不知道如何机械化(例如,来自Java的“解决方案”或诸如通配符和“对象”类型的变通方法已被允许使用)我至少要通过编译器的检查。)
我真正想要的是不更改模板类,允许多种数据类型而无需实例化模板类的多个对象。
我应该提到,我知道解决此问题的方法可能包括调用:
myTemplate<myDataType*, size> myObject
但是我可能需要更多细节,因为我是C ++的新手(我不知道我所不知道的东西)。
答案 0 :(得分:0)
我不太了解您的要求,但是如果您需要快速解决而不是将类创建为抽象类,那么c ++的很酷的功能之一就是虚拟与纯虚拟。如果您将函数保留为虚拟,则需要为函数提供定义。如果将它们变成纯虚拟的,则必须在继承的类中对其进行定义。
这是它的样子:
template <class type, size>
class myTemplate
{
public:
virtual void foo();
myTemplate(){};
};
void myTemplate::foo()
{
}
这允许继承的类覆盖foo函数,而不会为未定义的抽象类抛出编译器错误。
答案 1 :(得分:0)
来自Java,您需要了解C ++中的模板不同于Java中的泛型,更确切地说,模板是编译时泛型。
与模板有关或与模板有关的所有事物仅在编译时存在,因此,当您进行类似myTemplate<myDataType, size> myObject;
之类的事情时,实际上会发生两件事:
1。在编译时,将myDataType
和size
替换为模板,该模板又被实例化以创建类型。该类型的名称为myTemplate<myDataType*, size>
,并且是您在运行时使用的唯一类型。
2。在运行时,实例化创建的类型(myTemplate),以创建该类型的对象。
我们可以从中注意到,用不同的模板参数实例化的模板将在运行时产生完全不同的类型,它们之间没有任何关系,该关系仅在编译时存在。 这与泛型在Java中的工作方式相反,在Java中,泛型参数在编译时强制转换为Object,然后在运行时强制转换为实际类型。
希望这有助于了解C ++模板。