什么时候做
#includeclass MyString : public std::string { public: MyString() {} };
但用法如下:
MyString s = "Happy day"; MyString s("Happy Day"); MyString s = (MyString)"Happy day";
它们都不起作用.
似乎与构造函数/运算符声明/覆盖有关,但任何人都可以帮助指出我在哪里可以找到这些资源?
谢谢.
std::string
不是为继承而设计的.它没有任何虚函数(甚至不是析构函数!),所以你不能覆盖任何东西.它也没有受保护的接口,所以你不能通过创建一些独立的实用程序函数从子类化中获得任何东西std::string
.
请记住,大多数STL实现都希望您使用std::string
复制语义,而不是引用语义,这使得添加继承字段或覆盖函数的情况更加糟糕.
如果你真的想要一些类似于std::string
额外功能的东西,你可以考虑使用合成而不是继承,但这也不是很好.你不必担心std::string
析构函数没有被正确调用,但你最终std::string
必须从你需要的方法中包装很多方法,这很乏味.此外,您的实用程序函数只能在大多数代码期望时使用MyString std::string
,因此它不是非常可重用的.
你最好做一些实用功能std::string
.或者,如果std::string
没有提供您需要的内容,您应该使用其他适合您需求的字符串实现.以下是一些可能的想法:
SGI的STL扩展,std::rope
.它是在GNU C++中,所以也许你可以依赖它.
Boost有一个非常广泛的字符串算法库,允许您使用概念来指定字符串的表示方式.
如果必须从std :: string "派生",也请看这个
您需要为希望能够转换为字符串的不同类型定义一些构造函数.这些构造函数基本上只需将参数传递给底层std::string
.
如果您不手动创建它们,编译器会为您创建一个default-和copy-constructor:
MyString() : std::string() { } MyString(const MyString &other) : std::string(other) { }
要允许从字符串文字构造,您需要一个构造函数,它接受const char*
:
MyString(const char* other) : std::string(other) { }
采用a的构造函数const std::string&
对于将std::string
s 转换为字符串类型也很有用.如果你想避免普通字符串的隐式转换,你应该做到explicit
:
explicit MyString(const std::string &other) : std::string(other) { }
(编辑,因为我的原始版本充满了错误,我无法删除接受的答案)