2012-02-03 1 views
2

Когда я работал над проектом, который включал определение предложений на заданном языке, я с удивлением обнаружил, что деструктор std::string не был виртуальным. Это затруднило специализацию этого класса (мне пришлось создать обертку). Почему стандартный комитет решил, что этот класс не виртуальный?Почему std :: string не имеет виртуального деструктора?

в /usr/lib64/gcc/x86_64-pc-linux-gnu/4.5.3/include/g++-v4/bits/basic_string.h, мы имеем:

template<typename _CharT, typename _Traits, typename _Alloc> 
class basic_string 
{ 
    ... 

    /** 
    * @brief Destroy the string instance. 
    */ 
    ~basic_string() 
    { _M_rep()->_M_dispose(this->get_allocator()); } 
+0

Возможно, это похоже на Java: разработчикам не хотелось, чтобы программист расширил класс String, поскольку другие программисты ожидают, что String будет работать со стандартной реализацией, а не с каким-то определенным пользователем (и злонамеренным?) Поведением. –

ответ

9

Это дизайн , Я думаю, что дизайнер намекает, что класс не должен быть подклассифицирован.

Также обратите внимание на это: Why should one not derive from c++ std string class?

+0

Ну, это точно мой вопрос :) Я буду перефразировать спасибо – qdii

+1

Я могу сказать вам, что в организации, в которой я работал, мы получили класс String из std :: string, следуя правилу, которое производная строка никогда не будет содержать любые элементы данных, но должны быть расширены такими методами, как strip() и split(), поскольку они весьма удобны. Он работал нормально. Очевидно, что уровень дисциплины не требуется, чтобы никогда не вводить данные в этот класс. – Sid

+0

+1 Это интересно – qdii

3

Это не означает быть получены из. Ни один из стандартных классов.

Утвержденный способ повышения их - путем инкапсуляции, а не наследования.

+0

ok okay, это более общий, чем просто std :: string then – qdii

+2

"* Утвержденный способ повышения их - путем инкапсуляции, а не наследования. *" Или с помощью простых бесплатных функций. – ildjarn

+0

Некоторые классы потоков IO и все стандартные исключения имеют 'virtual' dtors. –