std::string
не предназначен для наследования. Он не имеет любых виртуальных функций (даже не деструктор!), Поэтому вы не можете переопределить что-либо. Он также не имеет защищенного интерфейса, поэтому вы ничего не получаете от подкласса, который вы не могли бы получить, создав некоторые автономные служебные функции, которые принимают std::string
.
Имейте в виду, что большинство реализаций STL предполагают, что вы используете std::string
с семантикой семантики, а не с помощью семантики ссылок, и это делает случай более сложным добавление унаследованных полей или переопределяющих функций.
Если у вас действительно хотите что-то вроде std::string
с дополнительными функциями, вы можете рассмотреть возможность использования композиции вместо наследования, но это тоже не очень удобно. Вам не нужно беспокоиться о том, что деструктор не получил правильное название, но вам нужно обернуть множество методов от std::string
, которые вам нужны, что очень утомительно. Кроме того, ваши служебные функции будут работать только с MyString, когда большинство кода ожидают std::string
, поэтому он не очень многоразовый.
Вам лучше сделать некоторые служебные функции, которые принимают std::string
.Или, если std::string
не предоставляет то, что вам нужно, вы должны пойти с некоторой другой реализацией строки, которая соответствует вашим потребностям. Вот некоторые возможности, которые приходят на ум:
Когда вы наследуете, вы скрываете нестандартные конструкторы базового класса. Если вы хотите вызвать эти конструкторы, вам необходимо определить нестандартные конструкторы в вашем подклассе, которые их вызывают. – ChrisW
Вы не должны наследовать от std :: string. Вы можете сказать, что это связано с тем, что у него нет виртуального деструктора. Вы открываете себя перед множеством потенциальных проблем. Сделайте std :: string членом. –