是从std :: basic_string继承好吗?

时间:2015-04-08 13:35:35

标签: c++ inheritance stl g++

我在这里读过一些类似的问题,但我仍然不确定答案。我知道不鼓励从​​STL类派生,但std :: basic_string似乎是一个很好的候选者。

我面临的问题是g ++正在抛出一个合适的东西,因为std :: basic_string没有虚拟析构函数。为什么不虚拟? std :: string不是从它派生出来的吗?

一次尝试:

class string_t :
  private std::basic_string<char>
{
public:
   string_t() :
      basic_string<value_type>() {}

   string_t(
      const basic_string<value_type>& s) :
         basic_string<value_type>(s) {}

   virtual ~string_t() {}
};

另一次尝试:

class string_t :
   public std::basic_string<char>
{
public:
   virtual ~string_t();
};

在使用-Weffc ++编译时都抛出此警告:

  

警告:基类'class std :: basic_string'具有非虚拟   析

1 个答案:

答案 0 :(得分:1)

好吧,STL类还没有被设计为继承。继承std::string和其他人的主要问题是他们没有虚拟析构函数。对于公共继承的基类来说,这是一个很大的禁忌,正如警告所表明的那样。但是,它对于私人继承来说并不那么危险。

在私有继承具有非虚拟析构函数的基类的情况下,没有发出错误bug report。它没有被标记为已修复,但是我的测试显示g++ 4.9.2没有发出私有继承警告。

此外,该错误中的评论显示了如何用(故意?)坏代码拍摄自己的脚:

class Foo {
public:
    ~Foo() {}
    virtual void f() { }
};

class Bar : private Foo {
public:
    Foo* get() { return this; }
};

int main()
{
    Bar* b = new Bar;
    delete b->get();
}

如果您避免将继承关系暴露在类之外,就像在上面的代码段中一样,私有地继承具有非虚拟析构函数的类也不错。如果不详细说明你将如何使用继承,那么就不可能说这是否是最好的方法。

  

不是std :: string派生出来的吗?

不,std::stringstd::basic_string<char>的别名。