从std::basic_string继承正常
Is inheriting from std::basic_string ok?
我在这里读过很多类似的问题,但我仍然不确定答案。我知道不鼓励从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"具有非虚拟析构函数
好吧,STL类并没有被设计为可继承的。继承std::string
和其他方法的主要问题是它们没有虚拟析构函数。正如警告所表明的那样,这对公共继承的基类来说是一个很大的禁忌。不过,这对私人继承来说并没有那么危险。
有一个错误报告,说明在私下继承具有非虚拟析构函数的基类的情况下没有发出错误。它还没有被标记为已修复,但我的测试显示,在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>
的别名。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- cppcheck在const std::string[]上引发警告
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 将std::string传递给WriteConsole API
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 为std::string的某个索引赋值
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- std中有类似find_last_of的函数,而string中没有
- 可以从std::string继承以提供类型一致性吗
- 在(私有)继承向量<string>上获取迭代器
- 从c++中的string继承
- 继承std::string类时跳过添加构造函数