C++ C++;基本继承概念

C++ C++;基本继承概念,c++,inheritance,C++,Inheritance,我目前是一名高中生,正在从事一个需要继承的项目。我和我的合作伙伴希望创建一个可以继承和执行string类的所有方法的类,同时我们可以自己动手。但是,我们不太确定如何指定,当我们希望调用一个继承的函数时,我们希望它是用我们的数据成员完成的。例如: Class string2: string { public: string2(string str) { stuff = str; } private: string stuff

我目前是一名高中生,正在从事一个需要继承的项目。我和我的合作伙伴希望创建一个可以继承和执行string类的所有方法的类,同时我们可以自己动手。但是,我们不太确定如何指定,当我们希望调用一个继承的函数时,我们希望它是用我们的数据成员完成的。例如:

Class string2: string
{
    public:
    string2(string str) 
    {
        stuff = str;
    }
    private:
        string stuff;
}
main
{ 
    string2 word ("Hello");
    word.substr(0, 1); 
}
如果我们要使用这个函数(假设它使用了正确的语法,这只是一个粗略的草图),我们需要做什么才能让答案显示为“H”。
谢谢

您私下继承了std::string。私有继承意味着没有其他人知道该继承。这意味着没有人能够像对待std::string一样对待string2,因为std::string部分是私有的。这基本上只是一种丑陋的构图形式。如果您认为公共继承解决了您的问题,请三思。字符串的析构函数不是虚拟的

此外,除了私有继承之外,您还有一个std::string数据成员。这是多余的,因为您的string2类已经继承了std::string的所有成员。如果您想扩展std::string的功能,有几个选项

您可以将其包装(无继承、存储std::string数据成员和对其进行隧道函数调用):

或者您可以包装它(私有继承,没有std::string数据成员,仍然可以通过隧道调用它):

或者,您可以编写非成员实用程序函数对其进行操作,并将其绑定到命名空间中:

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的每个成员都这样做。

我认为您不需要继承和字符串数据成员。它应该是一个或另一个,记住
std::string
不是为公共继承而设计的(在您的示例中,私有继承可能是可以接受的)。您是私有继承,这是一种丑陋的组合形式。string没有虚拟析构函数,所以任何公共继承的尝试都可能导致灾难。此外,除了私有继承之外,您还有一个字符串数据成员。那太浪费了。只要用你添加的功能在它周围写一个包装器就行了。@SchizoidSpag这很可能。但是,这可能是一种相对安全的方式,可以在不需要太多打字的情况下获取“资料”:(永远如此):@SchizoidSpag:@juanchopanza我肯定不知道这个成语,所以谢谢你!我认为使用指令的
私有继承方法比为字符串接口中的每个重载方法编写转发函数要简单得多(而且工作量要小得多)。非常感谢。正如我说的,我是高中生,我的老师没有检查过这个。我不知道当我们第一次提出这个想法时,他为什么允许我们这样做,但我会确保将这一点传递给我们小组的其他成员。再次感谢你,非常感谢你注意到了回复@Galik:using指令的私有继承方法可能更容易编写,但别忘了它还要求您在
string2
的头中包含
string,将
string
暴露给所有使用
string2
的对象,然而,包装器方法可以通过聚合和/或pImpl习惯用法避免这种情况。
namespace string2
{
    char GetFirstLetter(const std::string& str)
    {
        // blah blah
    }
}
class string2 : private std::string
{
public:
    using std::string::push_back;
};