Ich habe da eine Frage: Warum ist DerivedClass
erbt von ParentClass
?
Benötigen Sie ein polymorphes Verhalten, oder möchten Sie die Implementierung von ParentClass
?
Die Vererbung wird oft missbräuchlich eingesetzt. Wirklich.
Dann gibt es das (typische) Problem, eine Containerklasse zu haben, und wie man ihre Elemente freilegt. Leider sind die Iteratoren (trotz all ihrer Vorzüge) im Gegensatz zu den Zeigern, die sie emulieren sollen, schlecht von der Sprache unterstützt.
Also, eine Erinnerung: Vererbung es un ist- Beziehung, für die Wiederverwendung von Code gibt es Zusammensetzung .
Hier könnte man perfekt eine Vorlagenklasse schreiben, die die Rolle des Containers übernimmt und gemeinsame Methoden bereitstellt.
Dann, für das Problem der Darstellung... können Sie Ihre eigenen Iteratoren schreiben, mit der korrekten von der Basis abgeleiteten Beziehung, oder Sie können sich dafür entscheiden, eine Anzahl von Algorithmen vorauszuwählen ( sort
, foreach
, erase_if
), die mit benutzerdefinierten Prädikaten funktionieren würde.
template <class Value>
class Container
{
public:
template <class Pred>
void sort(Pred iPred);
template <class Pred>
Pred foreach(Pred iPred); // maybe a const-version ?
template <class Pred>
size_t erase_if(Pred iPred); // returns the number of erased
private:
std::vector<Value> m_data;
};
Dann weiter zum Unterricht:
class ParentClass
{
public:
virtual void foo() const;
private:
Container<ParentObj*> m_data;
};
class DerivedClass: public ParentClass
{
public:
virtual void foo() const;
private:
Container<DerivedObj*> m_data;
};
Versuchen Sie, Polymorphismus von der Wiederverwendung von Code zu trennen, und das Problem sollte einfacher werden.