私人继承得到了一个无法进入的基地"错误

时间:2014-04-03 01:00:10

标签: c++ inheritance private

这是MY_STRING类的实现。由于我希望只有一些指定的接口可见,所以我使用私有继承而不是公共接口。

class MY_STRING : private std::string
{
public:
   MY_STRING() : std::string() {}
   MY_STRING(const char* s) : std::string(s) {}
   using std::string::operator +=;
};
int main()
{
    MY_STRING s = "1", x = "2";
    s += x;
}

但是我收到了一个编译错误:'std :: basic_string'是'MY_STRING'无法访问的基础。 即使我有一个丑陋的解决方案如下

const MY_STRING& operator += (const MY_STRING& s) { static_cast<std::string*>
    (this)->operator+=(*static_cast<const std::string*>(&s)); return *this; }

我仍然想知道为什么会出现错误以及是否有更优雅的解决方案。

1 个答案:

答案 0 :(得分:1)

您只能在std::string::operator+=的成员函数中使用MY_STRING。局外人不能使用它。你无法宣传&#34;它与using或任何东西。

私人继承意味着什么。私有继承实际上与拥有私有成员变量相同,只是MY_STRING的成员函数中的语法不同。

要解决此问题,您必须不使用私有继承,或为要发布的内容编写转发函数。

此外,您的转发功能似乎不必要地复杂,请尝试:

MY_STRING &operator+= (MY_STRING const &s)
    { std::string::operator+=(s); return *this; }

在非const对象上调用时,您不希望返回const引用(并且+ =对const对象没有意义)。