#include <iostream>
class Base
{
protected:
void somethingProtected()
{
std::cout << "lala" << std::endl;
}
};
class Derived : public Base
{
public:
void somethingDerived()
{
Base b;
b.somethingProtected(); // This does not compile
somethingProtected(); // But this is fine
}
};
int main()
{
Derived d;
d.somethingDerived();
return 0;
}
Я думал, что, возможно, можно использовать только защищенные члены this
, а защищенные члены других экземпляров навсегда недоступны.
Но:
class Derived : public Base
{
public:
void somethingDerived(Derived& d)
{
d.somethingProtected(); // This compiles even though d is
// potentially a different instance
}
void somethingDerived(Base& b)
{
b.somethingProtected(); // This does not
}
};
Меня тошнит от этого, так как я некоторое время программировал на C++, но я не мог найти никакого объяснения такому поведению.
РЕДАКТИРОВАТЬ:
Неважно, тот же это экземпляр или другой:
int main()
{
Derived d1, d2; // Two different instances
d1.somethingDerived(d2); // This compiles fine
d1.somethingDerived(d1); // This compiles fine
return 0;
}
РЕДАКТИРОВАТЬ2:
Кажется, что когда речь идет о правах доступа, совершенно не имеет значения, какой экземпляр класса используется:
class Base
{
public:
void something(Base& b) // Another instance
{
++b.a; // But can enter private members
}
private:
int a;
};
Derived
. При первом доступе выражение объекта равно*b
, а при втором доступе -*this
. В соответствии с приведенным выше правилом, первый доступ недействителен, а второй доступ в порядке. 14.08.2015static
защищенных членов базового класса. 27.02.2020