1

2 つのクラスがあるとします。

class Parent
{
public:
   vector<int> x;
protected:
   void Method();
}

class Child : public Parent
{
public:
   vector<double> x;
}

このメソッドMethod()は、xと の両方のタイプに対応する操作を行いintますdouble

void Parent::Method() 
{ 
    x.push_back(1); 
}

次に、クラスのインスタンスを作成しChild、 を初期化し、基本クラスからvector<double> x派生メソッドを呼び出すとMethod()、C++ はのメンバーではなくParentのメンバーを操作しようとします。作成されたクラスに属するメンバーに対して自動的に動作するように基本クラスのメソッドを作成する方法はありますか?xChildChildvector<int> x

編集: McAden が正しく指摘したように、この動作はポリモーフィズムを使用して簡単に実現できます: 3 つのクラス - 1 つの基本クラスと 2 つの派生クラス。でも、2クラスだけでは無理ということでしょうか?

4

2 に答える 2

2

のインスタンスを作成したいだけで、 でベクターの型を指示しChildたいのでChild、この問題は template でより自然に解決されParentます。簡単な例として、何を含める必要がParentあるかによってパラメーター化できます。vector<>

template <typename T>
class Parent {
public:
    std::vector<T> x;
protected:
    void Method () { x.push_back(1); }
};

class Child : public Parent<double> {
    //...
};

で子供に制御させたいものが実際にたくさんある場合は、 の特性クラスのようにParent扱う必要があります。したがって、実際にはそのによってパラメータ化され、コードはCRTPを使用します。「静的ポリモーフィズム」を提供します。ChildParentParentChild

template <typename CHILD>
class Parent {
protected:
    void Method () {
        CHILD *child = static_cast<CHILD *>(this);
        child->x.push_back(1);
    }
};

class Child : public Parent<Child> {
public:
    std::vector<double> x;
};
于 2013-10-01T22:49:11.893 に答える
2

継承を処理する際にデータ型を変更することは、共分散が使用される場合を除いて、あまり可能ではありません。さまざまなデータ型を処理するクラスを作成したい場合、おそらく探しているのはテンプレート クラスです。

http://www.learncpp.com/cpp-tutorial/143-template-classes/

于 2013-10-01T22:31:15.193 に答える