C++ 基本继承概念

标签 c++ inheritance

我目前是一名高中生,正在从事一个需要继承的项目。我和我的搭档想制作一个可以继承和执行字符串类的所有方法的类,同时我们自己动手。然而,我们不是特别确定如何指定当我们想要调用一个继承的函数时,我们希望它通过我们的数据成员来完成。示例:

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/

相关文章:

java - @ManyToOne 映射不适用于连接继承

java - 多态性如何用于内部类?

c++ - C++ 类中的标记区域

c++ - cURL交叉编译

c++ - move 语义 std::move 如何使用它

swift - 使用添加的属性创建 UIImage 的子类

c++ - 如何正确解析传入的 HTTP 请求

c++ - 收到错误LNK2019和错误LNK1120

Java保护变量可以在同一个包内访问而不需要继承如何?

java - 抽象类中的同步