【问题标题】:C++ Using Abstract Classes in Template ClassesC++ 在模板类中使用抽象类
【发布时间】:2018-12-28 03:59:42
【问题描述】:

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

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++ 新手(我不知道我不知道什么)。

【问题讨论】:

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


【解决方案1】:

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

与模板有关的所有内容或模板仅在编译时存在,因此当您执行myTemplate&lt;myDataType, size&gt; myObject; 之类的操作时,实际上会发生两件事:

1.在编译时myDataType 和size 被替换为模板,而模板又被实例化以创建一个类型。这种类型的名称是myTemplate&lt;myDataType*, size&gt;,并且是唯一一种您在运行时使用的类型。

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

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

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

【讨论】:

  • 啊,这很有意义。鉴于此,我的架构中有一个逻辑错误。我不确定如何解决它;有没有办法重组我的父/子类关系,使我的每个子类都属于同一类型?例如,也许抽象类对我不起作用,但可能有另一种方式来格式化我的父类,这样我的子类都可以是“myDataType”类型。
  • 我想到了一种将我的子类折叠到父类中的方法,看起来我的代码现在可以正确编译了。我接受这个作为答案,因为它让我意识到我的架构错误。
【解决方案2】:

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

这是它的样子:

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

};

void myTemplate::foo()
{
}

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

【讨论】:

  • 在我的示例中,我将“myDataType”称为抽象类。 Java 的警告之一是接口类和抽象类之间的区别。对于 C++(如果我错了,请纠正我),接口和抽象类之间没有区别,但是接口中的方法和抽象类中的方法(分别是纯虚函数和虚函数)之间存在区别。在我的例子中,我的抽象类只包含虚函数,所以它类似于 Java 的抽象类。我只是希望在我的模板中允许多种数据类型。
猜你喜欢
  • 1970-01-01
  • 2014-11-02
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 2015-11-18
  • 2017-01-11
  • 2021-12-12
相关资源
最近更新 更多