質問

1つがもう1つを拡張する2つのクラスがあります。どちらも呼ばれる方法を持っています doSomething() それは何か違うことを実行します。切り替えることができるポインターを1つ持っていることができるようになりたい class Aclass B コードの残りの部分を同じように実行させます。それぞれが同じメソッド名を持っているためです。これは可能ですか、これはそれを行うための正しい方法ですか?また、私はC ++をかなり初めてなので、それはそれで単なる問題になる可能性があります。

class A {
    void doSomething()
    {
        // does something
    }
};

class B: public A {
    void doSomething()
    {
        //does something else
    }
};


main()
{
    A *ptr = new A;
    B *bptr = new B;

    // a giant loop

    ptr->doSomething();


    if(condition) 
    {
        ptr = bptr;
    }
}
役に立ちましたか?

解決

あなたが達成しようとしているのは、多型と呼ばれます。 C ++では、AとBの共通(おそらく要約)ベースクラスCを定義する必要があります。 仮想関数, 、aとbの両方でそれをオーバーライドし、タイプc*のポインターを作成します。がここにあります 良い入門記事 話題になっている。

他のヒント

これを達成するために私が考えることができる2つの方法。

あなたがすでに多型タイプを持っている場合、あなたの方法は(いくつかの小さな変更がある)問題です)。 (もしも B is-an A, 、論理的に)

class A
{
public:
    virtual void f() { /* something */ };
};

class B : public A
{
public:
   virtual void f() { /* something else */ };
};

int main()
{
   A a;
   B b;
   A* c = 0;

   // based on your condition
   c = &a;
   c->f();
   c = &b;
   c->f();

   return 0;
}

しかし、あなたのタイプが実際にそれほど密接に関連していない場合はどうなりますか?継承を使用することは、クラス間の非常に剛性のある(IS-A、この場合)関係を意味します。 aです B 本当に A?

同じ名前の関数を持つクラスでこれを達成する方法は次のとおりですが、実際には似たようなタイプではありません。

template <class T>
void do_f(T& obj)
{
   obj.f();
}

class D
{
public:
   void f() { /* something */ }
};

class E
{
public:
   void f() { /* something else entirely */ }
};

int main()
{
   // note, D and E have no relation
   D d;
   E e;

   // based on your condition
   do_f(d);
   do_f(e);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top