我想知道使用非虚拟派生什么时,由编译器产生的:非虚拟派生:我真的从编译器中得到什么?
template< unsigned int D >
class Point
{
int[D];
// No virtual function
// ...
};
class Point2 : public Point<2> {};
class Point3 : public Point<3> {};
这里并推导只意味着编译时检查?还是有一些其他开销?
我注意到,当使用Point2
或直接使用Point<2>
时,我的编译器会生成相同大小的对象。我推断派生没有产生一个虚拟表,因此,永远不会进行虚拟呼叫。
我错过了什么吗?
语境
我想提供一对夫妇给定类模板的预定义的特化。我开始用的typedef:
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;
这就是为什么我放弃了typedefs并使用了非虚拟派生。不过,我想知道的全部是什么意思。
(另一种策略是在一个专用的头文件编写一次向前声明,点菜#include <iosfwd>
)
对不起,但typedefs有什么问题? – ybungalobill 2010-09-21 15:52:49
我无法转发 - 声明类模板的typedef。例如,我不能转发声明'class ostream',我必须'#include'而不是 - 请参阅http://www.gotw.ca/gotw/034.htm –
2010-09-21 16:09:09
从这篇文章中,您必须使用''是正确地转发声明它将不得不在std命名空间中完成,这对您不合法。我看不出为什么你不能转发declare Point并在专用头文件中使用这些typedefs。 –
UncleBens
2010-09-21 17:27:03