понимание спецификатора доступа c ++

Я встретил следующий ответ в теме:

Защищенные члены могут быть доступны из производных классов. Частные не могут.

class Base {

private:
int MyPrivateInt;
protected:
int MyProtectedInt;
public:
int MyPublicInt;
};

class Derived : Base
{
public:
int foo1()  { return MyPrivateInt;} // Won't compile!
int foo2()  { return MyProtectedInt;} // OK
int foo3()  { return MyPublicInt;} // OK
};

class Unrelated
{
private:
Base B;
public:
int foo1()  { return B.MyPrivateInt;} // Won't compile!
int foo2()  { return B.MyProtectedInt;} // Won't compile
int foo3()  { return B.MyPublicInt;} // OK
};

1) мой вопрос:
Я прочитал: «Список деривации классов называет один или несколько базовых классов и имеет вид:

Производный класс: спецификатор доступа, базовый класс

Где указатель доступа — один из общедоступных, защищенных или частных, а базовый класс — это имя ранее определенного класса. Если спецификатор доступа не используется, то по умолчанию он является закрытым. «и» Частное наследование. При наследовании от частного базового класса открытые и защищенные члены базового класса становятся частными членами производного класса.

«

Итак … в нашем примере класс Derived: Base эквивалентен классу Derived: private Base, потому что не определен спецификатор доступа, но код работает так, как сказал писатель, так что мне не хватает? — я думал, что базовый класс для Класс Производный-спецификатор доступа частный поэтому открытые и защищенные члены Base должны быть приватными для класса Derived и недоступны … спасибо!

0

Решение

Это похожая идея. Вместо того, чтобы обращаться к тем членам класса, к которым у вас есть доступ, это относится к базовым классам, к которым вы можете получить доступ.

class A
{
public:
void f();
};class B : public A
{
public:
void g()
{
f(); // OK
A *a = this; // OK
}
};
class B2 : public B
{
public:
void h()
{
f(); //OK
A *a = this; // OK
};
};
B b;
A& ba = b;class C : protected A
{
public:
void g()
{
f(); // OK, can access protected base
A *a = this; // OK, can access protected base
}
};
class C2 : public C
{
public:
void h()
{
f(); // OK, can access protected base
A *a = this; // OK, can access protected base
};
};
C c;
c.f(); // Not OK, allthough A::f() is public, the inheritance is protected.
A& ca = c; // Not OK, inheritence is protected.class D : private A
{
public:
void g()
{
f(); // OK because A is a base of D
A *a = this;
}
};
class D2 : public D
{
public:
void h()
{
f(); //Not OK, A is inherited with private in D
A *a = this; //Not OK
};
};
D d;
d.f(); // Not OK, allthough A::f() is public, the inheritance is private.
D& da = d; // Not OK, inheritence is private.
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector