我目前是一名从事需要继承的项目的高中生。我和我的伙伴想要创建一个可以继承和执行字符串类的所有方法的类,而我们自己动手。但是,我们并不特别确定如何指定当我们想要一个被调用的继承函数时,我们希望它可以用我们的数据成员来完成。例如:
Class string2: string
{
public:
string2(string str)
{
stuff = str;
}
private:
string stuff;
}
main
{
string2 word ("Hello");
word.substr(0, 1);
}
如果我们要使用该功能(假设它使用了正确的语法,那只是一个粗略的草图),我们需要做的是将答案显示为“H”。 感谢
答案 0 :(得分:3)
您私下继承了std :: string。私有继承意味着没有其他人知道继承。这意味着没有人能像std :: string那样对待你的string2,因为std :: string部分是私有的。它基本上只是一种丑陋的构图形式。如果您认为公共继承可以解决您的问题,请再想一想。 std :: string的析构函数不是虚拟的。
此外,除了私有继承之外,还有一个std :: string数据成员。这是多余的,因为你的string2类已经继承了std :: string的所有成员。如果你想扩展std :: string的功能,你有几个选择。
你可以包装它(没有继承,存储std :: string数据成员,以及隧道函数调用):
class string2
{
public:
void push_back(char _ch)
{
mString.push_back(_ch);
}
private:
std::string mString;
};
或者你可以包装它(私有继承,没有std :: string数据成员,还有隧道函数调用):
class string2 : private std::string
{
public:
void push_back(char _ch)
{
std::string::push_back(_ch);
}
};
或者您可以编写操纵它的非成员实用程序函数,并将它们捆绑在命名空间中:
namespace string2
{
char GetFirstLetter(const std::string& str)
{
// blah blah
}
}
juan的奖金提及:如果你不想通过代码审查,你也可以写这个丑陋:
class string2 : private std::string
{
public:
using std::string::push_back;
};
请注意,push_back()仅作为示例。您需要为要暴露的std :: string的每个成员执行此操作。