0

互いに継承するクラスがいくつかありますが、テンプレートを使用して継承しています。私が望むのは、テンプレートに依存する他の可能な派生クラスの1つであるかのように、基本クラスの1つへのポインターおよび/または参照を効果的に取得することです

class a1
{
public:
   int a;
   virtual void func()
   {
   }
   // other non virtual functions ...
};

class b1
{
public:
    //no members or virtual functions
    //other non virtual functions ...
};

class a2
{
public:
   int a;
   // ...
};

template < class T1 >
class derived : public T1,
                public a2
{
    int a;
    // ...
};

派生クラスは、クラス a1 またはクラス b1 から継承できます。これは主に、派生のスペースを節約するためです。これは、b1 が空のクラスであるため、派生がテンプレート パラメーター b1 でインスタンス化されている場合、データ メンバーと仮想関数の余分な負荷がかからないためです。 a1の。

ただし、実際には派生型 (b1) のポインターまたは参照である派生 (a1) からポインターまたは参照を取得したいと考えています。

私が本当に求めているのは、offsetof() を実行する「良い」方法のヘルプですが、offsetof() a2 を取得できる継承を使用しています。これは、派生 (b1) の適切なポインターであると想定しています。空白のクラス。

私は派生(a1)オブジェクトのポインタを取得しようとしましたが、これが正しい位置になることを期待してsizeof(a1)を追加しましたが、他の誰かがより良い方法の提案を持っているかどうか知りたいと思っていました.

4

4 に答える 4

0

クラス b1 をクラス a1 の基本クラスとして持つ

于 2011-07-29T18:21:36.093 に答える
0

テンプレートを使用せず、多重継承のみを使用していた場合、d は Derived 型のインスタンスであるが、A1 として参照されていると仮定します。

A1* a = new Derived();
Derived* d = (Derived*)a;
B2* b = d;

ただし、テンプレートは物事を複雑にします。

于 2011-07-29T19:57:20.557 に答える