друг базы доступа

Я наткнулся этот вопрос без ответа, и это действительно озадачивает. Это поведение должно иметь какой-то смысл? Это в стандарте? Это вопрос:

class parentFriend;
class parent
{
friend class parentFriend;
public: void f1(){};
protected: void f2(){};
private: void f3(){};
};
class childpub: public parent {};
class childprot: protected parent {};
class childprv: private parent {};
class parentFriend
{
public:
void f()
{
/* which of the following statements will compile? why? why not?*/
parent p; p.f1(); p.f2(); p.f3(); // these will compile
childpub cpub; cpub.f1(); cpub.f2(); cpub.f3();
childprot cprot; cprot.f1(); cprot.f2();
cprot.f3(); // does not compile
childprv cprv;
cprv.f1(); // does not compile
cprv.f2(); // does not compile
cprv.f3(); // does not compile
}
};

0

Решение

Из того, что я понял, прочитав ссылку, которую вы разместили (см. Также тот же вопрос Вот с некоторыми ответами), автор оригинального вопроса был удивлен поведением компилятора gcc (поток от 2009, gcc версии 4.0.1, упомянутый в потоке), который компилировал без ошибок эту строку, тогда как он не должен иметь:

childprot cprot; cprot.f1(); cprot.f2(); // (2)

Я попробовал ваш код в MSVC 2010, и эта строка не компилируется, дружба не наследуется, как ожидается стандартом.

1

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

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

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