Problem mit geschützten Feldern in der Basisklasse in C ++
-
06-07-2019 - |
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
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; }
};