【发布时间】:2013-07-10 13:17:19
【问题描述】:
这是一个出于对 C++ 规则的好奇而没有任何实际用途的问题。在玩弄模板时,我创建了一个类层次结构,如下所示:
#include <stdio.h>
// Declaration
template <int X = 0>
struct A;
// Specialization for X = 0
template <>
struct A<0>
{
virtual void foo()
{
printf("A<0>::foo()\n");
}
};
// Extended generalized implementation
template <int X>
struct A : public A<0>
{
virtual void foo()
{
printf("A<1>::foo()\n");
}
virtual void bar()
{
printf("A<1>::bar()\n");
}
};
int main()
{
A<> a0;
A<1> a1;
a0.foo();
a1.foo();
a1.bar();
return 0;
}
这段代码在 Visual Studio 上编译得很好并产生了预期的输出:
A<0>::foo()
A<1>::foo()
A<1>::bar()
这是一种有效的 C++ 设计实践吗?这对我来说确实很奇怪,所以我想知道这是否是某种未定义的行为,它恰好取决于编译器,有很多陷阱和陷阱,或者它是否是模板的定义明确的用法。
看看这方面的任何实际例子会很有趣。
【问题讨论】:
-
没有未定义的行为。它按预期工作。模板实例化可以派生自另一个模板实例化(请记住,同一模板的两个单独实例化是两个单独的类)。例如,当且仅当
X != 0时,这允许您拥有一个具有bar()函数的A<X>。
标签: c++ templates inheritance specialization