частное и публичное наследство - PullRequest
1 голос
/ 16 января 2010

У меня есть вопрос, основанный на этом вопросе

В разделе http://www.parashift.com/c%2B%2B-faq-lite/private-inheritance.html#faq-24.3 упоминается следующее:

Законное, долгосрочное использование для частного наследования - это когда вы хотите создать класс Fred, который использует код в классе Wilma, а код из класса Wilma должен вызывать функции-члены из вашего нового класса Fred. В этом случае Фред вызывает не-виртуалы в Wilma, а Wilma вызывает (обычно чистые виртуальные) сам по себе, которые переопределяются Фредом. Это было бы намного сложнее сделать с композицией.

Однако мне хотелось бы знать, почему использование публичного наследования не дает такого же эффекта. то есть следующий фрагмент кода на c # делает то же самое ..

class Wilma
{
    protected void FredCallsWilma() {
        Console.Write("Fred Calls Wilma ;");
        WilmaCallsFred();
    }

    protected virtual void WilmaCallsFred() {}
}

class Fred : Wilma
{
    public void barney(){
        Console.Write("barney;");
        FredCallsWilma();
    }

    protected override void WilmaCallsFred(){
        Console.Write("Wilma Calls Fred ;");
    }
}

class Program
{
    static void Main(string[] args){
        Fred f1 = new Fred();
        f1.barney();
    }
}

печатает

гулянка; Фред Коллс Вильма; Вилма Коллс Фред

Итак, что особенного в частном наследовании, как указано в c ++ faq lite. Разве замена публичного наследования на частное наследование не сработала бы для достижения этого результата?

Ответы [ 2 ]

4 голосов
/ 16 января 2010

Публичное наследование делает базовый класс доступным для внешнего мира. Например, указатель на производный класс может быть преобразован (неявно, не меньше) в указатель на базовый класс. Рассмотрим стек, полученный из связанного списка. Как правило, вам НЕ нужно, чтобы кто-то неявно преобразовывал ваш массив в его базовый связанный список, что позволило бы ему делать вещи, не разрешенные для стека, такие как вставка или удаление элементов в середине.

Обычное значение, приписываемое частному наследованию, - «Реализуется в терминах» - это означает, что мы обычно НЕ хотим, чтобы внешний мир / пользователь видел / знал / заботился о том, что этот класс имеет базовый класс , Публичное наследование должно следовать правилу подстановки Лискова, которое гласит, что производный класс может быть заменен везде, где требуется публичный базовый класс. Что касается частного наследования, мы специально НЕ говорим, что производный класс может заменить базовый класс.

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

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

1 голос
/ 16 января 2010

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

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

...