Вопрос

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

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

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

Тем не менее, я хотел бы знать, почему использование публичного наследства не достигнет того же эффекта. т.е. Следующий кусок кода 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. Разве общественное наследство не заменило бы публичную наследство на частную наследственность, чтобы добиться этого результата?

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top