2015-08-16 38 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」;在最後的聲明中使用了賦值運算符。 –