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

C++ Using Abstract Classes in Template Classes

假设我有一个模板 class 例如:

template <class type, size>
class myTemplate

我有一个抽象基础 class:

class myDataType

和各种衍生的classes

class subDataType1 : public myDataType
class subDataType2 : public myDataType
           ...
class subDataTypeN : public myDataType

我想做的是打电话:

 myTemplate<myDataType, size> myObject;

然而,这显然行不通,因为在模板内部,我将实例化一个抽象对象 class。基本上,我希望模板与我派生的任何一个 classes 一起使用,但我不知道如何将其机械化(来自 Java where "solutions" 或类型通配符等变通方法和 "Object",例如,可能让我至少通过了编译器的检查)。

我真正想要的是不改变我的模板 class,允许多种数据类型而无需实例化我的模板的多个对象 class。

我应该提一下,我知道这个问题的解决方案可能涉及如下调用:

 myTemplate<myDataType*, size> myObject

但我可能需要比这更多的细节,因为我是 C++ 的新手(我不知道我不知道什么)。

我不太明白你在问什么,但如果你需要快速解决而不是创建 class 作为抽象,c++ 中的一个很酷的特性是虚拟与纯虚拟。如果您将函数保留为虚拟函数,则需要为该函数提供定义。如果将它们设为纯虚拟,则必须在继承 classes.

中定义它们

这是它的样子:

template <class type, size>
class myTemplate
{
    public:
    virtual void foo();
    myTemplate(){};

};

void myTemplate::foo()
{
}

这允许函数 foo 被继承的 classes 覆盖,而不会为未定义的抽象 classes 抛出编译器错误。

来自 Java 您需要了解 C++ 中的模板与 Java 中的泛型不同,更准确地说,模板是编译时泛型。

所有与模板有关的东西或者是模板只存在于编译时,因此当你做类似 myTemplate<myDataType, size> myObject; 的事情时,实际上会发生两件事:

1.At 编译时 myDataTypesize 被替换为模板,模板又被实例化以创建类型。此类型的名称是 myTemplate<myDataType*, size>,并且是您在 运行 时间使用的唯一类型。

2.At 运行-实例化创建的类型 (myTemplate) 以创建该类型的对象。

从这里我们可以注意到,使用不同模板参数实例化的模板将在 运行 时产生完全不同的可用类型,它们之间没有任何关系,这种关系仅在编译时存在. 这与泛型在 java 中的工作方式形成对比,在 java 中泛型参数在编译时被转换为 Object,然后在 运行 时被转换为实际类型。

希望这有助于阐明 C++ 模板。