我知道在C 中擴展內置類是被廢棄的,但我仍然想這樣做,因為某些原因。
我想在一個擴展/繼承自std::string類的類(str)中添加我的自定義方法(這是個例子)
但是當我這樣做的時候,我遇到了一些問題,這些方法在std::string類中已經存在(內置方法),例如,
#include <bit/stdc .h>/span>
using namespace std;
class str : public string {
public:
string s;
str(string s1) {
s = s1; //ig 問題出在這里。
}
};
int main() {
str s("hello world"/span>);
cout << s.size(); //prints out 0 not 11 => length of "hello world"
}
我如何繞過這個問題?
uj5u.com熱心網友回復:
std::string不知道你的string s;成員。它不可能在其方法中使用它。如果你想使用繼承而不是組合,你需要使用std::string的公共介面下的任何東西 - 在這種情況下,它的建構式。
class str : public string {
public:
str(string s1): string(string s1) //initialize base class using its constructor.
{
}
};
//or
class str : public string {
public:
using string::string; //bring all std::string constructors into your class.
};
作為一個腳注,從標準容器中繼承并沒有被廢棄,但它們并不是為了這個目的,你只能安全地做一些非常有限的事情。例如,這就是未定義的行為:
std::string* s = new str("asdf") 。
delete s; /span> UB!
更詳細的解釋在這個問題中。
另外,你應該堅決避免<bits/stdc .h>和使用命名空間std;,特別是你不應該把它們混在一起。你會把自己幾乎所有的名字都剝離出來,而且會產生難以發現的bug。
。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/313397.html
標籤:
