Защищенный конструктор в c++
Понимаю, что это все делать скорей всего бессмысленно, но мне интересна причина результата.
Почему этот код:
#include <iostream>
class A
{
protected:
A()
{
}
};
class B : public A
{
public:
void f()
{
A a;
}
};
int main()
{
return 0;
}
Выдает ошибку:
test.cpp:18:5: error: ‘A::A()’ is protected within this context
18 | A a;
| ^
test.cpp:7:2: note: declared protected here
7 | A()
| ^
Ведь класс B может использовать Protected члены класса A.
Ответы (1 шт):
Автор решения: TigerTV.ru
→ Ссылка
Это связано с тем, что A a; - другой объект. Доступ к полям родительского класса осуществляется только в пределах одного объекта. Т.е. в данном случае контекст другой.
Попробуйте код:
#include <iostream>
class A {
public:
A() { b = 5;}
protected:
int b;
};
class B : public A {
public:
void f() {
std::cout << this->b << std::endl;
A a;
std::cout << a.b << std::endl;
}
};
int main() {
return 0;
}
Ошибка компиляции:
main.cpp: In member function ‘void B::f()’:
main.cpp:14:18: error: ‘int A::b’ is protected within this context
std::cout << a.b << std::endl;
^
main.cpp:7:6: note: declared protected here
int b;
При этом this->b принимается.