Frage

Ich habe zwei Klassen, wobei einer die andere erweitert. Sie haben beide eine Methode namens namens doSomething() Das führt etwas anderes aus. Ich möchte in der Lage sein, einen Zeiger zu haben, von dem ich wechseln kann class A zu class B und lassen Sie den Rest des Codes gleich ausführen, da sie jeweils den gleichen Methodennamen haben. Ist das möglich und ist dies der richtige Weg, dies zu tun? Außerdem bin ich bei C ++ ziemlich neu, also könnte es nur ein Problem sein.

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;
    }
}
War es hilfreich?

Lösung

Was Sie erreichen möchten, wird als Polymorphismus bezeichnet. In C ++ müssen Sie eine gemeinsame (möglicherweise abstrakte) Basisklasse C für A und B definieren. Virtuelle Funktion, überschreiben Sie es sowohl in A als auch in A und B und machen Sie Zeiger von Typ C*. Hier ist ein guter Einführungsartikel zum Thema.

Andere Tipps

Zwei Möglichkeiten, wie ich mir vorstellen kann, um dies zu erreichen.

Ihr Weg ist in Ordnung (mit kleinen Änderungen), wenn Sie bereits polymorphe Typen haben). (Wenn B ist ein A, logisch)

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;
}

Aber was ist, wenn Ihre Typen nicht wirklich so eng miteinander verbunden sind? Die Verwendung von Vererbung impliziert eine sehr starre (IS-A, in diesem Fall) Beziehung zwischen Ihren Klassen. Ist ein B Wirklich an A?

Hier ist eine Möglichkeit, dies für Klassen zu erreichen, die die gleiche benannte Funktion haben, aber nicht wirklich ähnliche Typen haben.

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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top