@markusha16

Наследование C++?

Вообщем вопрос следующий.
Наследование в C++.
Понял, то что наследование типо такого:
5cb7a1722bfb4f8aacbf8e964902dbcf
Да, всё легко понятно.
Но вот в чём вопрос:
Спецификатор доступа, что он решает в данном случае.
В остальных понятно.
2ef109c4c4ea42078d4dec722045d2db
Не только private, и всё остальные тоже .
Зачем они вообще при описании наследования нужны ?
Книгу читал, но не понял...(
  • Вопрос задан
  • 981 просмотр
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
Private и protected — это когда объект скрывает, что унаследован от студента. Снаружи не виден ни факт наследования, ни отцовские поля.
class Father {};
class Son : private Father {};

int main()
{
    Son son;
    Father& q = son;
}

error: 'Father' is an inaccessible base of 'Son'

Private и protected — скорее «хаки» и пользоваться ими не рекомендуется. Хотя, разумеется, пользуются, чтобы упростить себе жизнь. Я вижу два назначения: 1) хорошая основа для совершенно постороннего класса; 2) реализация интерфейса, которая нужна только внутри.

Вот пример второго. Объект FileWriter реализует интерфейс Callback для своих внутренних нужд.
#include <iostream>

class Callback {
public:
    virtual void act(int x) = 0;
};

void generateFibonacci(int n, Callback& callback) {
    int x1 = 0, x2 = 1;
    for (int i = 0; i < n; ++i) {
        callback.act(x2);
        int x3 = x1 + x2;
        x1 = x2;
        x2 = x3;
    }
}

class FileWriter : private Callback {
public:
    FileWriter(std::ostream& aOs, int aN) : os(aOs), n(aN) {}
    void run() { generateFibonacci(n, *this); }
private:
    std::ostream& os;
    const int n;
    void act(int x) override { os << x << std::endl; }
};
using namespace std;

int main()
{
    FileWriter wri(std::cerr, 10);
    wri.run();
}

А если реальная жизнь — то объект может быть одновременно QDialog (диалоговое окно) и QAbstractItemModel (модель данных для какой-нибудь таблицы, лежащей на этом окошке). Хотя, повторяю, это скорее хак.

P.S. В Delphi и Java всё наследование публичное, и если нужно скрытно реализовать какой-то интерфейс или задействовать удобный класс — то только скрытым полем. Так, как в комментариях.

P.P.S. Пример первого. Какой-нибудь Array2d скрыто наследуется от Array1d, потому что у него совершенно другой интерфейс. У Array1d — alloc(n) и operator()(i), у Array2d — alloc(m, n) и operator()(i, j). А Array1d — неплохая штука, чтобы управляться блоком памяти длиной m×n элементов.
Ответ написан
zagayevskiy
@zagayevskiy
Android developer at Yandex
Тут всё просто. public значит, что все будут знать, о том, что student1 унаследованные от student, публичные методы student's будут видны наружу.
protected значит, что это знают только student1 и его потомки. private значит, что только student1 знает об этом наследовании.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы