我想知道使用非虚拟派生时编译器会产生什么:
template< unsigned int D >
class Point
{
int[D];
// No virtual function
// ...
};
class Point2 : public Point<2> {};
class Point3 : public Point<3> {};
这里的推导是否只意味着编译时检查?还是有其他开销?
我注意到我的编译器在直接使用Point2
or时会产生同样大小的对象Point<2>
。我推断推导不会产生 vtable,因此,永远不会进行虚拟调用。
我错过了什么吗?
语境
我想为给定的类模板提供几个预定义的特化。我从 typedefs 开始:
template< unsigned int D >
class Point
{
int[D];
};
typedef Point<2> Point2;
typedef Point<3> Point3;
唉,这会阻止客户端使用“简单”的前向声明:
// No #include <Point.h>
class Point2; // 'Point2': redefinition; different basic types
class Point3; // 'Point3': redefinition; different basic types
然后必须编写这段相当不直观的代码:
// No #include <Point.h>
template< unsigned int > class Point;
typedef Point<2> Point2;
typedef Point<3> Point3;
这就是我放弃 typedef 并使用非虚拟派生的原因。不过,我想知道所有的含义是什么。
(另一种策略是在专用头文件中编写一次前向声明,à la #include <iosfwd>
。)