是否允许从std命名空间中的类继承(即std :: wstring)?

7 c++ gcc stl g++

类std :: wstring缺少"普通"c字符串(和文字)的一些操作.

我想在我自己的自定义类中添加这些缺少的操作:

#include <string>

class CustomWString : public std::wstring {

        public:

            CustomWString(const char*);
            const char* c_str(void);
};
Run Code Online (Sandbox Code Playgroud)

上面的代码在使用g ++ v4.4.1的Ubuntu Karmic上编译得很好.

但我想知道是否有反对这样做的论据?

编辑:一些例子来澄清我对"缺失操作"的意思:

std::wstring foo("hello"); // requires the L() macro or something like that
std::string bar("hello");
std::wstring goose(bar.c_str());

foo="hello";  // requires the L() macro
foo=bar.c_str();
foo=bar;
Run Code Online (Sandbox Code Playgroud)

编辑:我想以某种方式"集中".那是因为我有一个项目要从M $ -Windows移植,其中有数千个这些失败的操作.

好处是:有一个中心位置,其中定义了要使用的字符串类型,例如:

#ifdef WINDOWS_OS
    typedef std::wstring AppStringClass;
#else
    typedef std::string AppStringClass;
#endif
Run Code Online (Sandbox Code Playgroud)

小智 15

这是合法的,但很多人认为这是不可取的.问题是标准库模板类没有虚拟析构函数.所以,如果您编写这样的代码:

std::wstring * p = new CustomWString ;
...
delete p;
Run Code Online (Sandbox Code Playgroud)

你有未定义的行为.


pet*_*hen 10

编译器肯定会让你,因为没有办法用C++中的公共构造函数密封类.

STL容器不是为继承而设计的,因此通常是一个坏主意.C++必须忽略许多奇怪的角落.您的派生类可能会破坏另一个STL实现,或者只是更新构建环境.

但是,我认为这是一个严厉的警示标志,而不是完全禁止.这是"你真的很确定你在做什么,你知道所有的影响,并且对所有选择都有很好的论据"吗?

在您的情况下:提供额外的构造函数很好(因为公共接口已记录并且您可以复制它),并且只要您不引入新数据成员或VMT,切片或非虚拟析构函数不是问题.(请记住,虽然C++标准在通过没有虚拟DTor的基类指针进行删除时声明了未定义的行为)

但是,我不确定如何在char const * c_str()不为字符串提供存储的情况下实现.一旦你引入了新的数据成员,你就进入了一个地雷领域.