C ++在模板类中使用抽象类

时间:2018-07-19 22:07:42

标签: c++ abstract-class derived-class template-classes

假设我有一个模板类,例如:

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 ++的新手(我不知道我所不知道的东西)。

2 个答案:

答案 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。在编译时,将myDataTypesize替换为模板,该模板又被实例化以创建类型。该类型的名称为myTemplate<myDataType*, size>,并且是您在运行时使用的唯一类型。

2。在运行时,实例化创建的类型(myTemplate),以创建该类型的对象。

我们可以从中注意到,用不同的模板参数实例化的模板将在运行时产生完全不同的类型,它们之间没有任何关系,该关系仅在编译时存在。 这与泛型在Java中的工作方式相反,在Java中,泛型参数在编译时强制转换为Object,然后在运行时强制转换为实际类型。

希望这有助于了解C ++模板。