我目前是一名高中生,正在从事一个需要继承的项目。我和我的搭档想制作一个可以继承和执行字符串类的所有方法的类,同时我们自己动手。然而,我们不是特别确定如何指定当我们想要调用一个继承的函数时,我们希望它通过我们的数据成员来完成。示例:
Class string2: string
{
public:
string2(string str)
{
stuff = str;
}
private:
string stuff;
}
main
{
string2 word ("Hello");
word.substr(0, 1);
}
如果我们要使用那个函数(假设它使用正确的语法,那只是一个粗略的草图),我们需要做什么才能让答案显示为“H”。 谢谢
最佳答案
您是从 std::string 私有(private)继承的。私有(private)继承意味着没有其他人知道继承。这意味着没有人能够像对待 std::string 一样对待您的 string2,因为 std::string 部分是私有(private)的。它基本上只是一种丑陋的组合形式。如果您认为公共(public)继承可以解决您的问题,请三思。 std::string 的析构函数不是虚拟的。
此外,除了您的私有(private)继承之外,您还有一个 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;
};
或者你可以包装它(私有(private)继承,没有 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 的每个成员执行此操作。
关于C++ 基本继承概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26393898/