Алмазное наследование со смешанными модификаторами наследования (защищенное / частное / общедоступное) - PullRequest
4 голосов
/ 22 января 2012

скажем, у нас есть class A,B,C,D, где A - основание, B, C - между, а D получено в алмазной модели.

ПРИМЕЧАНИЕ:

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

class C виртуальное наследство 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?

Рисунок №2:

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

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

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

};

Полагаю, member будет публичным во втором примере, не так ли?

1 Ответ

6 голосов
/ 22 января 2012

§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, доступ разрешен. - конец примера ]

Я думаю, мне не нужно ничего добавлять, но смотрите также этот отчет о дефектах (который был закрыт как "не дефект").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...