从C++字符串的子类返回新实例的正确方法

Mik*_*ike 2 c++

我想扩展C++字符串类,返回子类引用(而不是父字符串引用),但此代码摘录...

#include <string>
using namespace std;

class mystring : public string
{
public:
 mystring&  left( int cnt )
 {   return  (mystring&)mystring( substr(0,cnt) );
 }
};
Run Code Online (Sandbox Code Playgroud)

产生这个VS8编译器错误:

错误C2440:'':无法从'std :: basic_string <_Elem,_Traits,_Ax>'转换为'mystring'

声明mystring :: left()的正确方法是什么,所以编译器会停止抱怨,希望也能消除演员表?

dir*_*tly 6

错误C2440:'':无法从'std :: basic_string <_Elem,_Traits,_Ax>'转换为'mystring'

从C2440上的MSDN页面:

C2440也可能因错误使用用户定义的转换而发生.有关用户定义的转换的更多信息,请参阅用户定义的转换).以下示例生成C2440.

您遇到的错误是因为您尝试通过对派生类的对象的引用来返回基类对象.它的工作原理相反.因此,你需要演员阵容 - 这很糟糕.

标准容器(包括std::string)不适合继承,而是使用聚合.

你不需要演员string&.

尝试这样的事情:

#include <string>
using namespace std;

class mystring     {
public:
 // create an appropriate conversion op/ctor between string -> mystring
 mystring(string const& s) : impl(s) {}
 mystring  left( int cnt )
 {   
     return mystring( impl.substr(0,cnt) );
 }
 string impl;

};
Run Code Online (Sandbox Code Playgroud)