2011-10-18 18 views
1

膨大な量のデータ(私が使用しているライブラリ)上の数値計算に使用されるコードで、C++のアップキャストの理由は何でしょうか?なぜ算術演算子とアクセス演算子を使用するときにアップキャストするのですか?

は、次の階層を考えてみましょう:

template<class T> 
class unallocatedArray 
{ 
    public: 
     unallocatedArray(int size, T t) 
      : size_(size), t_(0) 
     { 

     } 

     // Copy constructor. This is the only way to 
     // actually allocate data: if the array is 
     // passed as an argument to the copy constr. 
     // together with the size. 

     // Checks. Access operators. Iterators, etc. 
     // Wrappers for stl sorts... 

    private: 
     int size_; 
     T* t_; 
}; 


template<class T> 
class myArray 
: public unallocatedArray<T> 
{ 
    public: 
     // This type actually allocates the memory. 
     myArray (int size) 
      : unallocatedArray<T>(size) 
     { 
      // Check if size < 0.. 

      // Allocate. 
      this->t_ = new T[size]; 
     } 

     myArray (int size, T t) 
     { 
      this->t_ = new T[size]; 

      for (int i = 0; i < this->size_; i ++) 
      { 
       this->t_[i] = t; 
      } 
     } 

     // Some additional stuff such as bound checking and error handling. 
     // Append another array (resizing and memory copies), equality 
     // operators, stream operators, etc... 

}; 

template<class T> 
class myField 
: public myArray<T> 
{ 
    public: 
     // Constructors call the parent ones. No special attributes added. 

     // Maping operations, arithmetical operators, access operator. 
}; 

// 

template<class T> 
class geomField 
: public myField<T> 
{ 
    // myField but mapped on some kind of geometry, like surface meshes, 
    // volume meshes, etc. 
}; 

これは単にアクセス演算子はすべての方法まで定義されており、算術演算子はmyFieldでクラスに配置されていることを述べるために、ちょうど非常に非常に単純化したモデルです。

GeomField<myType> geomFieldObject; 

myField<myType>& downCast = geomFieldObject; 

// Do the arithmetical operations on the downCast reference. 

アクセス要素 次のように算術表現

を実行します。1は、以下の1e07回言う実行する必要がある場合は今、何を、myFieldでのgeomFieldをアップキャスト理由をだろう

このようなフィールドのうちの2つについては、アップキャストは何らかのペナルティを導入していませんか?算術演算子はgeomFieldに公開されていませんか:これは公開継承の全ポイントではありませんか?

私はこれを設計していなかった、それは私が開発していたOSライブラリーからだ。:)

ありがとう!

+1

ダウンキャストはどこですか?我々はそれを見ていない。 C++には、非常に異なる特性を持つキャスト演算子が多数あります。このコードからはわかりません。 – sehe

+4

)これはちょうど貧しい人の 'ベクトル'ですか? b)あなたが話しているこの「アクセス演算子」は何ですか? c)あなたは "アップキャスト"を意味する、d)バーチャルなものはないので、ランタイムディスパッチはありません。 –

+0

はい、それは貧しい人のベクトルです、libはSTLの前に開発されました。 b)演算子[]はアクセス演算子、貧しい人のラッパー、c)アップキャスト...ごめんなさい... d)これはどういう意味ですか? (私はメカ技師です) – tmaric

答えて

1

私は推測できますが、ジオメトリマッピングを実装するために、算術演算の一部がgeomFieldに上書きされている可能性があります。

geomFieldのデータがあり、マップされていない操作を実行したい場合、これがアップキャストの理由になる可能性があります。

一方、キャストされた参照で実行される操作のいずれもがgeomFieldに上書きされない場合、キャストは必要ではないということは間違いありません。

一般的にアップキャスティングでは、通常は(またはいずれの場合でも私は今確信が持てません)、コンパイル時に完全に行われるため、パフォーマンス上の欠点はありません:

class A { 
public: 
    void f(); 
}; 

class B : public A { 
public: 
    void f(); // Overwrites A::f 
}; 

あなたがコードしているとき、それは

B::f(&obj); 
のようなものに、コンパイラで翻訳されて

B obj; 
obj.f(); 

のように見えます

static_cast<A>(obj).f(); 

A::f(&obj); 

もたらす即ち鋳造によって導入なしランタイムオーバーヘッドが存在しません。