Давайте начнем с базовой концепции,
class A {
protected:
int x;
};
class B : public A {
public:
void foo() {
int u = x; // OK : accessing inherited protected field
}
};
Так как child наследует родителя, child получает x.Следовательно, вы можете получить доступ к x напрямую в методе foo () child.Это концепция защищенных переменных.Вы можете получить доступ к защищенным переменным parent в child напрямую.Примечание: здесь я говорю, что вы можете получить доступ к x напрямую, но не через объект A!Какая разница ?Поскольку x защищен, вы не можете получить доступ к защищенным объектам A за пределами A. Не имеет значения, где он находится - если он главный или дочерний.Вот почему вы не можете получить доступ следующим образом
class B : public A {
protected:
A *a;
public:
void foo() {
int u = x; // OK : accessing inherited protected field x
int w = a->x; // ERROR : accessing a's protected field x
}
};
Вот интересная концепция.Вы можете получить доступ к закрытой переменной класса, используя ее объект в классе!
class dummy {
private :
int x;
public:
void foo() {
dummy *d;
int y = d->x; // Even though x is private, still you can access x from object of d - But only with in this class. You cannot do the same outside the class.
}
};
// То же самое для защищенных переменных. Поэтому вы можете получить доступ к следующему примеру.
class B : public A {
protected:
A *a;
B *b;
public:
void foo() {
int u = x; // OK : accessing inherited protected field x
int y = b->x; // OK : accessing b's protected field x
int w = a->x; // ERROR : accessing a's protected field x
}
};
Надеюсь, что это объясняет:)
C ++ - это полное объектно-ориентированное программирование, где Java чисто объектно-ориентированный:)