我是 C 的新手。我寫了這段代碼來理解和之間public的區別。問題是,當我創建 的物件時,出現此錯誤:protectedprivateHund4
洗掉函式的使用
這個錯誤在最后一行。
你能幫我解決這個問題嗎?
#include <iostream>
#include <iostream>
#include <string>
using namespace std;
class Tier
{
public:
void wieMachtDasTier()
{
cout << "Hello\n";
}
protected:
void foo()
{
cout << "foo\n";
}
private:
void baz()
{
cout << "baz\n";
}
};
class Hund: public Tier
{
private:
string name;
public:
Hund(string newname):name(newname){}
string getname()
{
return this->name;
}
void test()
{
foo();
}
};
class Hund2: protected Tier
{
public:
void test()
{
foo();
}
};
class Hund3: private Tier
{
public:
void test()
{
foo();
}
};
class Hund4 : public Hund
{
};
int main()
{
Hund ace("ace");
ace.wieMachtDasTier();
Tier Haustier;
ace.test();
Hund2 ace2;
ace2.test();
Hund3 ace3;
ace3.test();
Hund4 ace4;
return 0;
}
uj5u.com熱心網友回復:
派生自的Hund類沒有默認建構式,因此也沒有默認建構式。但是,您可以從 a或 a構造 a :Hund4Hund4Hund4std::stringHund
Hund4 ace4(std::string{"ace4"});
Hund4 ace4(Hund{"ace4"});
using std::literals;
Hund4 ace("Waldi"s);
出于某種原因,請其他人解釋為什么 aconst char *足以Hund但不適用于Hund4。
或者,您必須提供Hund4一個建構式:
class Hund4 : public Hund
{
public:
Hund4(string newname) : Hund(newname) { }
};
Hund4 ace4("ace4");
uj5u.com熱心網友回復:
Tier沒有用戶宣告的建構式,并且std::string是可默認構造的,因此Tier具有編譯器生成的默認建構式。
Hund2并Hund3派生自Tier,沒有用戶宣告的建構式,也沒有任何不可默認構造的資料成員,因此它們也有編譯器生成的默認建構式。
Hund另一方面,它有一個用戶宣告的建構式,所以它沒有編譯器生成的默認建構式。
Hund4沒有用戶宣告的建構式,但Hund不是可默認構造的,因此Hund4沒有編譯器生成的默認建構式。
所以,如果你想Hund4成為默認可構造的,你需要:
使
Hund默認可構造,例如:class Hund: public Tier { private: string name; public: Hund() {} Hund(string newname) : name(newname) {} // or: // Hund(string newname = "") : name(newname) {} ... };給出
Hund4自己的用戶宣告的默認建構式,它呼叫Hund的非默認建構式,例如:class Hund4 : public Hund { public: Hund4() : Hund("") { } // or: // Hund4(string newname = "") : Hund(newname) { } };
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/483355.html
上一篇:PyTorch的自定義資料集類是否應該繼承自torch.utils.data.Dataset-為什么兩者都有效?
