class Base
{
protected:
void func1();
};
class Derived : public Base
{
friend class Third;
};
class Third
{
void foo()
{
Derive d;
d.func1();
}
};
mogę skompilować kod w VC14 (Visual Studio 2015) Błąd withour ale się błąd z VC12 (Visual Studio 2013)Different zachowanie o C++ Przyjaźni i dziedziczenia z VC12 i VC14
cannot access protected member declared in class 'Base'
którzy jest w porządku? Jaka jest poprawność takiego freindship z dziedziczenia?
z MSDN https://msdn.microsoft.com/en-us/library/465sdshe.aspx lub http://en.cppreference.com/w/cpp/language/friend Wygląda na to, że przyjaźń nie jest przechodnia i nie może zostać odziedziczona. Jednak myślę, że tak naprawdę nie jest tak w przypadku tego przykładu kodu.
Ale dlaczego VC14 nie dostarczy mi błędu?
Jeśli VC14 ma rację, w jaki sposób mogę "zmodyfikować" kod tak, aby VC12 również było w porządku? aby zdefiniować chronione func1() ponownie w klasie Derived?
wątpię można skompilować ten kod w dowolnym kompilatorem: to brakuje niektórych średników. – rubenvb
Błąd nie działa na GCC http://ideone.com/Zue7WL. –
Dobre pytanie. Transwersja i dziedziczenie nie mają zastosowania, ponieważ jest to klasa pochodna, która deklaruje Trzecie jako przyjaciela. Kod jest akceptowany przez clang i gcc. – drRobertz