Как мне получить доступ к частным унаследованным членам класса в C ++? - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь понять концепцию частного наследования.

До сих пор везде, где я вижу, пишут, что частное наследование делает его члены недоступными из производного класса.

Разве это не делает его бесполезным? Если я не могу получить доступ к унаследованному классу, какова цель получения в первую очередь?

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

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Ваш вопрос звучит так, как будто private участники были бы вообще бесполезны. Я имею в виду, что вы могли бы также спросить, для чего нужен частный член, если к нему нельзя получить доступ извне. Однако класс (обычно) имеет больше, чем может использовать подкласс.

Рассмотрим этот простой пример:

struct foo {
    void print(); 
};

struct bar : private foo {
    void print_bar() {
        std::cout << " blablabla \n";
        print();
        std::cout << " bblablabla \n";
    }
};

Класс, наследующий от bar, даже не заметит, что bar наследует от foo. Тем не менее, bar имеет смысл наследовать от foo, поскольку использует его функциональность.

Обратите внимание, что частное наследование на самом деле ближе к композиции, а не к публичному наследованию, и выше также может быть

struct bar { 
    foo f;
    void print_bar() {
        std::cout << " blablabla \n";
        print();
        std::cout << " bblablabla \n";
    }
};

Как получить доступ к частным унаследованным членам класса в C ++?

Вне класса: Вы не знаете, для чего private. Это не отличается для частных членов или частных методов в целом, они существуют по определенной причине, вы просто не можете получить к ним доступ извне.

0 голосов
/ 17 сентября 2018

Частное наследование - это способ смоделировать отношения. Обычной альтернативой модели является композиция, которую следует использовать, когда это возможно. Частное наследование полезно для моделирования отношения has-a, когда задействованы защищенные члены класса.

Другой способ его создания - «мы хотим использовать реализацию этого класса, но игнорировать его интерфейс».

(Мой опыт работы с этим ограничен, и это то, что я помню из Scotty Meyers Effective C ++, поскольку никогда не возникало случая, когда я бы предпочел частное наследование, а не композицию)

0 голосов
/ 17 сентября 2018

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

Например, я использую Boost (www.boost.org) для моего класса дат, но я не хочу, чтобы это показывалось пользователям моего класса дат, так как однажды я мог бы захотеть отключить Boost для чего-то другого.

...