Преодоление алмазной двусмысленности по-другому

Я знаю проблему алмаза и способ ее решения с использованием виртуального базового класса. Я пытался решить проблему с бриллиантом другим способом, но безуспешно. Я не знаю почему.

#include <iostream>

using namespace std;
class A
{
    public:
       void display()
       {
           cout << "successfully printed";
       }
};

class B: public A
{

};

class C: private A // display() of A will become private member of C
{

};

class D: public B, public C // private member display() of C should not be inherited
{

};

int main()
{
    D d;
    d.display();
    return 0;
}

Поскольку частные члены не наследуются, класс D не наследует никаких функций от C, а когда класс D наследует классы B и C, в D должна быть только 1 функция display(). Но когда я пытаюсь получить доступ к функции display(), используя объект класс D, он показывает ту же проблему, что функция отображения неоднозначна.


person Rohit Negi    schedule 04.11.2014    source источник
comment
если вы используете частное наследование, то вместо этого вы можете использовать агрегацию для класса C (т.е. иметь A в качестве члена), поскольку вы реализуете C в терминах A   -  person Pete    schedule 05.11.2014


Ответы (1)


«Частные члены не наследуются» — ложная предпосылка, это не Java.

Доступ к членам в C++ был разработан таким образом, что если вы замените любой private: на public:, поведение программы не изменится.

Из-за этого поиск имени, который происходит здесь, когда компилятор встречает имя "display" в d.display(), сначала находит все функции-члены в d с этим именем (их две), а затем находит наилучшее совпадение (сбой здесь ), и только потом проверяет, не окажется ли он недоступным из-за правил доступа к членам.

person Cubbi    schedule 14.11.2014