Frage

Ich habe eine Basisklasse, sagen BassClass, mit einigen Feldern, die ich machte sie geschützt und einige rein virtuelle Funktionen. Dann wird die abgeleitete Klasse, sagen DerivedClass, wie class DerivedClass : public BassClass. Sollte nicht DerivedClass die geschützten Felder aus BassClass erben? Als ich versuchte, die DerivedClass zu kompilieren, beschwert sich der Compiler, dass DerivedClass hat keine dieser Felder, was hier falsch ist? Dank

War es hilfreich?

Lösung

Wenn BassClass (sic) und DerivedClass Vorlagen sind, und das BassClass Mitglied können Sie von DerivedClass zugreifen möchten nicht als abhängig Name angegeben, wird es nicht sichtbar sein.

z.

template <typename T> class BaseClass {
protected: 
    int value;
};

template <typename T> class DerivedClass : public BaseClass<T> {
public:
    int get_value() {return value;} // ERROR: value is not a dependent name
};

Zugang erhalten Sie weitere Informationen geben. Zum Beispiel könnten Sie in vollem Umfang den Namen des Mitglieds angeben:

    int get_value() {return BaseClass<T>::value;}

Oder Sie könnten es explizit machen, dass Sie zu einer Klasse Mitglied sich beziehen:

    int get_value() {return this->value;}

Andere Tipps

Das funktioniert:

#include <iostream>

struct Base {
virtual void print () const = 0;
protected:
int val;
};

struct Derived : Base {
void print () { std::cout << "Bases's val: " << val << std::endl; }
};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top