首页 > 解决方案 > 从模板参数派生的类

问题描述

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

class A1
{    };

class A2
{    };

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

同样,为什么以下不是编译时错误?不会有 2 个版本的Derived类,一个继承自,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>;    
}

标签: c++templatesinheritance

解决方案


不会有两个类Derived,继承自A1and A2,但实际上是一个类Derived<A1>and Derived<A2>。您传递给模板参数的数据成为类的一部分。DelcaringDerived<A1>并将其传递A1T实例化类模板的模板参数。

我认为这里解释得更好:

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

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


推荐阅读