2012-03-30 1 views

答えて

5

VecとをCONSTする基準のパラメータ変更:

virtual void Add(Vec const &vector) = 0; 

クラス(公に)はVec由来の基底クラスを参照して渡すことができます。

また、Vecを基本クラスとして使用する予定があるため、おそらくdtorも仮想にしたいと考えています。それ以外の場合、派生した型のオブジェクトを、ポインタやベースへの参照を介して破棄しようとすると、未定義の動作が発生します。

+0

"エラーC2503: 'Vec':基本クラスにゼロサイズの配列を含めることはできません。なぜこれがですか? (これは私がそれから継承した後です) – NBcode

+0

@NBcode: 'dim'のサイズを指定する必要があります:' double dim [10]; 'あなたがサイズを知っていないならばもしそうなら、 'std :: vector dim;'を使いたいと思うでしょう。 –

+0

私はVecから継承したVec3クラスを作った。オーバーライドAdd()メソッドのパラメータを強制的に "Vec3"にすることは可能ですか? – NBcode

2

利用のconst Vecを参照、またはVecを

class Vec 
{ 
    double dim[]; 
public: 
    virtual void Add(const Vec& vector) = 0; 
}; 
2

へのポインタはい、あなたはポインタまたはVecへの参照渡し:

class Vec 
{ 
    double dim[]; 
public: 
    Vec(void); 
    ~Vec(void); 
    virtual void Add(Vec* vector) = 0; 

}; 

そのclassへのポインタからの変換を暗黙のうちにVecからVec*に派生します。

値渡しの場合、オブジェクトのスライシングが実行され、動作は期待どおりになりません。

関連する問題