Простое и эффективное решение пытается использовать метод .contains.
test.classList.contains(testClass);
Вы можете получить доступ только к защищенным членам в экземплярах вашего типа (или получить от вашего типа). Вы не можете получить доступ к защищенным членам экземпляра родительского или двоюродного типа.
В вашем случае класс Derived
может получить доступ только к члену b
экземпляра Derived
, а не к другому Base
.
Изменение конструктора для получения экземпляра Derived
также решит проблему.
У вас есть доступ к защищенным членам Derived
, но не к Base
(даже если единственная причина, по которой это защищенный член Derived
, состоит в том, что он унаследован от Base
)
Использовать указатель this
для доступа к защищенным членам
class Derived : public Base
{
protected:
int d;
public:
void DoSomething(const Base& that)
{
this->b+=that.b;
d=0;
}
};
protected
можно получить:
this
указатель Чтобы решить ваше дело, вы можете использовать один из двух последних вариантов.
Accept Производится в Derived :: DoSomething или объявляет Derived friend
к базе:
class Derived;
class Base
{
friend class Derived;
protected:
int b;
public:
void DoSomething(const Base& that)
{
b+=that.b;
}
};
class Derived : public Base
{
protected:
int d;
public:
void DoSomething(const Base& that)
{
b+=that.b;
d=0;
}
};
В некоторых случаях вы также можете рассматривать публичные геттеры.
Как уже упоминалось, это именно то, как работает язык.
Другим решением является использование наследования и переход к родительскому методу:
class Derived : public Base
{
protected:
int d;
public:
void DoSomething(const Base& that)
{
Base::DoSomething(that);
d=0;
}
};
class Derived : public Base
{
protected:
int d;
public:
void DoSomething()
{
b+=this->b;
d=0;
}
};
//this will work