非仮想派生を使用する場合、コンパイラによって何が生成されるのか疑問に思っています。
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 が発生しなかったと推測されるため、仮想呼び出しは行われません。
何か不足していますか?
環境
特定のクラス テンプレートの定義済みの特殊化をいくつか提供したいと考えています。私は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;
これが、typedef を破棄し、非仮想派生を使用した理由です。それでも、私はすべての意味が何であるか疑問に思っています。
(別の戦略は、前方宣言を専用のヘッダー ファイルに 1 回記述することです#include <iosfwd>
。)