【问题标题】:Derived class from template parameter从模板参数派生的类
【发布时间】:2020-01-03 09:43:20
【问题描述】:

Derived类的多个定义是不允许的,所以下面是编译时错误。

class A1
{    };

class A2
{    };

class Derived: public A1
{    };
class Derived: public A2
{    };

同样,为什么以下不是编译时错误? Derived 类不会有 2 个版本,一个继承自 A1 而另一个继承自 A2

class A1
{    };

class A2
{    };

template<class T>
class Derived: public T
{    };

int main()
{
        Derived<A1> *ptr1 = new Derived<A1>;
        Derived<A2> *ptr2 = new Derived<A2>;    
}

【问题讨论】:

  • 因为Derived&lt;T&gt;,不同的T,是不同的类
  • @anurag86:模板参数是类型的一部分(并且它们与二进制文件中的类名混合在一起)
  • Derived 不是类,是类模板; Derived&lt;A1&gt; Derived&lt;A2&gt; 是类;但不同。
  • “班级名称保持不变” 不是。你有两个不同的类:Derived&lt;A1&gt;Derived&lt;A2&gt;Derived 本身不是一个类,它是一个类模板。 “它没有被破坏。” 但它是? typeid(...).name() 分别给了我7DerivedI2A1E7DerivedI2A2E
  • 是的。只是在类中添加了几个函数并调用了它们。并运行 nm out|xargs c++filt|grep Derived 并显示没有 DerivedDerived&lt;A1&gt;Derived&lt;A2&gt; 。谢谢大家

标签: c++ templates inheritance


【解决方案1】:

不会有两个Derived 类,继承自A1A2,但实际上是一个类Derived&lt;A1&gt;Derived&lt;A2&gt;。您传递给模板参数的数据成为类的一部分。删除 Derived&lt;A1&gt; 并将 A1 传递给模板参数 T实例化类模板。

我认为here 解释得更好:

模板实例化 涉及生成具体类或 模板的特定组合的函数(实例) 论据。

而且根本不会有Derived 类。正如max66在评论中指出的,Derived不是一个类,而是一个类模板,不会单独编译,没有实例化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2019-11-09
    相关资源
    最近更新 更多