我在这里读过一些类似的问题,但我仍然不确定答案。我知道不鼓励从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'具有非虚拟 析
答案 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::string
是std::basic_string<char>
的别名。