2009-06-18 4 views
2

Ich suche nach einer sauberen Art, dies seit langer Zeit zu tun. In meinem Problem gibt es 3 Klassen, die keine gemeinsamen Eltern teilen, aber alle Methoden mit dem gleichen Namen haben (A.doSomething, B.doSomething, C.doSomething). Mit der gleichen Funktionssignatur wird die Klasse D, die von A herrührt und die Methode doSomething() verwendet, für E, die von B oder C erbt, gleich aussehen. HierMehrere Vererbungshierarchie

ist eine Skizze von dem, was ich möchte in der Lage sein zu tun:

class Base { 
    public: 
    void myMethod(void) { doSomething(); } 
}; 

class Independent { 
    public: 
     doSomething(); 
}; 

clase Derived : public Base : public Independent { 
(...) 
}; 

int main(void) { 
    Derived *derivedObject = new Derived(); 
    derivedObject->myMethod(); 
} 

Bei diesem Problem Objekt vom Typ „Independent“ wird durch eine Bibliothek zur Verfügung gestellt, die ich nicht ändern kann. Ich möchte eine Basisklasse definieren, die Methoden verwendet, die später vererbt werden. Ich konnte keinen geeigneten Weg finden, dies mit virtueller Vererbung zu tun, ohne mehrdeutiges Kompilieren zu verursachen.

+0

Können Sie Ihr Problem ein wenig deutlicher erklären? Ich sehe nur eine Methode namens "doSomething" in diesem Code-Snippet, aber Sie erwähnen drei Klassen, die es in der Beschreibung haben, und Sie sagen nicht, was die "myMethod" -Methode sein soll. –

Antwort

5

Sie haben dort eine unangenehme Situation. Eine Lösung dieses Problems würde die Merkwürdiger Recurring Template-Muster werden mit der Vererbung zur Compile-Zeit auszuführen, wie folgt aus:

template <typename D> 
class Base { 
    public: 
     void myMethod(void) { static_cast<D*>(this)->doSomething(); } 
}; 

class Independent { 
    public: 
     void doSomething(); 
}; 

clase Derived : public Base : public Independent { 
    /*...*/ 
}; 

int main(void) { 
    Derived *derivedObject = new Derived(); 
    derivedObject->myMethod(); 
} 

Alternativ könnten Sie wählen eine Mittelsmann Klasse setzen dazwischen Independent weiterleiten (ich nehme an Sie haben viele Klassen, die von denselben Base und Independent abgeleitet sind, und wollen das nicht für jede Klasse tun müssen).

template <typename D> 
class Base { 
    private: 
     virtual void doSomethingImpl(); 
    public: 
     void myMethod(void) { doSomethingImpl(); } 
}; 

class Independent { 
    public: 
     void doSomething(); 
}; 

class IndependentWrapper : public Base : public Independent { 
    private: 
     void doSomethingImpl() { Independent::doSomething(); } 
}; 

clase Derived : public IndependentWrapper { 
    /*...*/ 
}; 

int main(void) { 
    Derived *derivedObject = new Derived(); 
    derivedObject->myMethod(); 
} 
Verwandte Themen