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 编译时 myDataType
和 size
被替换为模板,模板又被实例化以创建类型。此类型的名称是 myTemplate<myDataType*, size>
,并且是您在 运行 时间使用的唯一类型。
2.At 运行-实例化创建的类型 (myTemplate) 以创建该类型的对象。
从这里我们可以注意到,使用不同模板参数实例化的模板将在 运行 时产生完全不同的可用类型,它们之间没有任何关系,这种关系仅在编译时存在.
这与泛型在 java 中的工作方式形成对比,在 java 中泛型参数在编译时被转换为 Object,然后在 运行 时被转换为实际类型。
希望这有助于阐明 C++ 模板。
假设我有一个模板 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 编译时 myDataType
和 size
被替换为模板,模板又被实例化以创建类型。此类型的名称是 myTemplate<myDataType*, size>
,并且是您在 运行 时间使用的唯一类型。
2.At 运行-实例化创建的类型 (myTemplate) 以创建该类型的对象。
从这里我们可以注意到,使用不同模板参数实例化的模板将在 运行 时产生完全不同的可用类型,它们之间没有任何关系,这种关系仅在编译时存在. 这与泛型在 java 中的工作方式形成对比,在 java 中泛型参数在编译时被转换为 Object,然后在 运行 时被转换为实际类型。
希望这有助于阐明 C++ 模板。