我是 C 的新手。我寫了這段代碼來理解和之間public
的區別。問題是,當我創建 的物件時,出現此錯誤:protected
private
Hund4
洗掉函式的使用
這個錯誤在最后一行。
你能幫我解決這個問題嗎?
#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 :Hund4
Hund4
Hund4
std::string
Hund
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-為什么兩者都有效?