2015-08-16 45 views
1

我陷入与需要自建类称为string_extend从string类继承的功课。下面的string_extend类是我的代码,main()部分是作业所需的部分。继承:类字符串

class string_extend:public string{ 
    public: 
     string_extend(const string& str):string(str){} 

}; 
int main(){ 
    string_extend a("amd"); 
    string_extend b(a); 
    cout<<a<<b; 
} 

任何人都可以提供任何关于如何从类字符串继承所有功能的提示吗?

+4

哦亲爱的使用命名空间标准;并从一个标准类继承。时间去找一个新老师...... – Puppy

+0

我没有在这里发布这个部分,但我确实在我的代码中输入了它。 – jombo

+0

你输入了什么?新老师?还是适当的设计? –

回答

2

任何人都可以提供任何关于如何继承string类的所有功能?

您的代码确实已经。但是,您的main未使用任何string的成员函数;它使用构造函数,它们不会被继承,除非你另外告诉编译器(见下文)。

为了使用构造函数从您需要在派生类中定义具有相同签名的构造函数的基类。你为一个构造函数做了string&,但不是用于main正在使用的其他构造函数。

在C++ 03它完成与第一个构造函数的方式一样,即

string_extend(const char* str):string(str){} 

demo 1.

在C++ 11可以inherit constructors

class string_extend:public string{ 
    public: 
     using string::string; 
}; 

+0

您可以使用继承构造函数来继承它们。 – Puppy

0

通过公开声明的字符串作为基类,类已经继承字符串的方法。

+0

但我仍然无法打印出类string_extend作为普通字符串类 – jombo

0

你的类具有人从类string已准备好继承的方法。你可以使用append或insert等方法。

公有继承意味着从string所有公共方法都成为你的类公有,保护和私有也在你的类一样。

所以,你可以用你的对象是这样的:

string_extend obj("Hello world"); 
string_extend obj2("Test"); 
obj.append(obj2); 
+1

这不是什么问题。 –

+2

@MateuszGrzejek然而它已被选为正确的答案? – Scooter

+0

问题是关于如何继承所有功能。我已经说过,类string中的所有方法都已经被继承并解释了公有继承的原理。 – Stivius

0

您可以访问类性病的成员函数::字符串,不重复宣告他们在派生类中。

类的简化版本可以看看下面的方式

#include <iostream> 
#include <string> 

int main() 
{ 
    class string_extend : public std::string 
    { 
    public: 
     using std::string::string; 
     using std::string::operator =; 

     string_extend() : std::string() {} 
     string_extend(const string_extend &src) : std::string(src) {} 
     string_extend & operator =(const string_extend &src) 
     { 
      std::string::operator =(src); 

      return *this; 
     } 
    }; 

    string_extend s1; 
    string_extend s2({ 'A', 'B', 'C' }); 
    string_extend s3("Hello"); 
    string_extend s4(8, '*'); 

    std::cout << s1.size() << std::endl; 
    std::cout << s2.size() << std::endl; 
    std::cout << s3.size() << std::endl; 
    std::cout << s4.size() << std::endl; 

    std::cout << "\"" << s1 << "\"" << std::endl; 
    std::cout << "\"" << s2 << "\"" << std::endl; 
    std::cout << "\"" << s3 << "\"" << std::endl; 
    std::cout << "\"" << s4 << "\"" << std::endl; 

    s4 += { 'A', 'B', 'C' }; 

    std::cout << "\"" << s4 << "\"" << std::endl; 
}  

程序输出是

0 
3 
5 
8 
"" 
"ABC" 
"Hello" 
"********" 
"********ABC" 

如果你愿意,你也可以添加移动构造函数和移动赋值运算符。

+0

对不起,我只是C++的初学者。你能告诉我这是什么意思吗? std :: string :: operator =(src); – jombo

+0

@jombo它是一个在类std :: string中重载的赋值运算符。例如,你可以写:std :: string s; s =“ABC”;在最后的声明中使用了赋值运算符。 –