【问题标题】:C++ - Derive class off of std::string class to add extra function?C++ - 从 std::string 类派生类以添加额外功能?
【发布时间】:2015-05-04 11:47:49
【问题描述】:

首先,我知道std::string 类具有我可能需要的所有功能。这只是为了测试目的,看看我将来能做什么。

无论如何, 说我有这个:

class MyString : public std::string { }

然后,例如,我将如何使用:

MyString varName = "whatever";

因为我肯定会收到错误,因为“whatever”是 std::string 不是 MyString 类的成员?

如果你明白我的意思,我将如何解决这个问题?

(顺便说一句,我知道这可能是一个非常愚蠢的问题,但我很好奇)

【问题讨论】:

    标签: c++


    【解决方案1】:

    简单地从一个类派生来添加成员函数并不是一个好主意;尤其是像std::string 这样的非多态类。相反,编写非成员函数来对现有的字符串类做任何你想做的事情。

    如果你真的想这样做,你可以继承构造函数:

    class MyString : public std::string {
    public:
        using std::string::string;
    };
    

    现在你可以用任何你可以初始化std::string的方式来初始化你的类,包括从你的例子中的字符数组转换。 (顺便说一下,"whatever" 不是std::string,它是一个以零结尾的字符数组,const char[9]。)

    【讨论】:

    • 还有关于从标准库类派生的一般情况,here are some things to consider
    • 也许你应该添加一个注释,这仅适用于 C++11。我知道,自从它发布以来已经有一段时间了,但是没有-std=c++11 的使用 gcc 的初学者仍然会遇到编译器错误并感到困惑。
    • 这到底是如何工作的。你现在可以写MyString str("hello") 我假设。您还可以将新的构造函数重载添加到 std::string 中的构造函数重载吗?
    • @CássioRenan:如有必要,我会将这些事情留给 cmets。初学者不应该使用过时的方言。
    • @rozina:这里真的不是语言教程的地方。请参阅en.cppreference.com/w/cpp/language/…,或您最喜欢的 C++ 书籍。回答您的问题:是的,是的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2020-02-23
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多