2012-01-21 3 views
4

предположим, что у нас есть class A,B,C,D, где A является базой, B, C находятся между ними, а D - в алмазной модели.Наследование диаманта со смешанными модификаторами наследования (защищенное/частное/общедоступное)

Примечание:

class B наследует virtualy class A в частном режиме,

class C inherita virtualy class A в защищенном режиме.

class A 
{ 
public: 
    int member; // note this member 
}; 
class B : 
    virtual private A // note private 
{ 

}; 
class C : 
    virtual protected A // note protected 
{ 

}; 
class D : 
    public B, // doesn't metter public or whatever here 
    public C 
{ 

}; 

int main() 
{ 
    D test; 
    test.member = 0; // WHAT IS member? protected or private member? 
    cin.ignore(); 
    return 0; 
} 

теперь, когда мы делаем экземпляр class D, что член будет тогда? частный или защищенный LOL?

Рисунок No2:

что, если мы делаем это так:

class B : 
    virtual public A // note public this time! 
{ 

}; 
class C : 
    virtual protected A // same as before 
{ 

}; 

Я полагаю, member будет опубликована в этом втором примере ISN это?

ответ

6

§11.6 Multiple access [class.paths]

Если имя может быть достигнуто несколькими путями через множественного наследования графа, доступа является то, что путь, который дает наибольший доступ. [Пример:

class W { public: void f(); }; 
class A : private virtual W { }; 
class B : public virtual W { }; 
class C : public A, public B { 
    void f() { W::f(); } // OK 
}; 

Поскольку W::f() доступен для C::f() вдоль общественного пути через B, доступ разрешен. -end пример]

Я думаю, что мне не нужно, чтобы добавить что-нибудь еще, но смотри также this defect report (который был закрыт, как «не дефект»).

+0

+1 для соответствующей и точечной цитаты источника. –

+0

@ Kerrek: Спасибо за редактирование, я не помню, как легко вставлять код в цитату. :) – Xeo

+0

Это я сказал им мой предыдущий комментарий: D public имеет больше «власти», а затем частный или защищенный. хороший пример, спасибо. но это не относится к комбинации PRIVATE/PROTECTED! список наследования имеет больше мощности в этом случае :) круто. – codekiddy

Смежные вопросы