Использование функции публично в базовом классе и приватно в производном классе - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть функции public void myFunction(foo); и public void myFunction(foo, bar); в моем родительском классе.Я хочу, чтобы эти функции были включены в мой производный класс, но в частном порядке.Вы можете объявить его в закрытом разделе производного класса по using BaseClass::myFunction().Обратите внимание, что он не принимает никаких параметров в функции.Но если есть две реализации myFunction, как у меня в моем случае, это не сработает, так как не может различить две функции.Как реализовать обе функции в частном порядке?

1 Ответ

0 голосов
/ 15 февраля 2019

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

Частное наследованиедопустимая особенность C ++, но часто это не очень хороший выбор дизайна.Я не буду вдаваться в подробности, я не рекомендую это вообще, я оставлю вас искать это в другом месте на SO, но также рекомендую книги Скотта Мейера, эффективные C ++ и более эффективные C ++, которые покрывают это.

(защищенное наследование, с другой стороны, очень необычно)

В своем вопросе вы, похоже, начинаете с публичного наследования и пытаетесь сделать некоторые унаследованные функции частными с помощью.Это плохой выбор дизайна, как упоминалось в комментариях.Это нарушает принцип подстановки Лискова.Так как наследование PUBLIC подразумевает is-a, мы можем представить код, который создает ссылку на базовый класс для объекта производного типа, что тогда произойдет, когда мы попытаемся вызвать скрытую функциональность с этой ссылкой на базовый класс?

Derived d;
Base& b = d;
b.HiddenFunction(); // calling the function on d even though you thought you hid it

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

class OrderedLinkedList : private LinkedList
{
     public:
     using LinkedList::ItemCount;  // expose some specific base functionality
};

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

void SomeFunction()
{
    // call base version, not this derived version recursively
    NameOfBaseClass::SomeFunction();
}

В реализации производного класса открытые и защищенные члены(частный) унаследованный базовый класс доступен без необходимости делать что-либо вроде добавления использования.

Частное наследование не является отношением is-is, как публичное наследование, поскольку мы не можем ссылаться на производные объекты как ссылки / указатели набаза.Частное наследование является "реализованным в терминах".

Поскольку частное наследование не является is-a, нельзя заменять такие производные объекты на базу, и, таким образом, принцип замены Лискова просто не применяется.

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