// 第一種方式
using Sub = struct _Sub {
std::string id;
std::string name;
};
Sub instance{"a", "b"}; //正常
// 第二種方式
using Base = struct _Base {
std::string id;
};
using Sub1 = struct _Sub1 : public _Base {
std::string name;
};
using Sub2 = struct _Sub2 : public _Base {
std::string name;
bool load;
};
Sub1 instance{"a", "b"}; //報錯,沒有合適的建構式
第二種方式的類有了繼承關系,用結構體初始化的方式創建實體時會報找不到建構式的錯誤,需要在類宣告中加入合適的建構式。
有沒有什么辦法可以不用自定義建構式,直接像結構體那樣初始化呢?
uj5u.com熱心網友回復:
不行!為什么不定義建構式??????
不能初始化,可以賦值比如這樣
Sub1 instance;
instance.id = "a";
instance.name = "b";
uj5u.com熱心網友回復:
我只寫出來這兩個成員變數,實際上有一堆成員變數,要是定義建構式的話又要寫一大堆,還有什么拷貝構造 =運算子函式,想想就頭疼,
還是直接采用賦值的方式了
uj5u.com熱心網友回復:
我的理解,當一個類里面沒有建構式,沒有繼承,沒有虛函式,那么它的記憶體布局等同于c語言的struct因此它可以直接使用{......};方式來確定。他也可以直接用memcpy,malloc,等來初始化。。。
而有了繼承后,他的記憶體布局不同于c語言的struct,因此需要建構式。。。。。。
uj5u.com熱心網友回復:
有道理,,,
有沒有哪位大俠反匯編看過這兩種情況下struct的記憶體布局是怎么樣的

uj5u.com熱心網友回復:
百度一下Pod記憶體布局uj5u.com熱心網友回復:
繼承的作用是什么?繼承的作用的之一,就是服務于多型。
那么你此處使用繼承意義是什么???
直接定義的一個結構體不香嗎?
uj5u.com熱心網友回復:
不行!
為什么不定義建構式??????
不能初始化,可以賦值比如這樣
Sub1 instance;
instance.id = "a";
instance.name = "b";
我只寫出來這兩個成員變數,實際上有一堆成員變數,要是定義建構式的話又要寫一大堆,還有什么拷貝構造 =運算子函式,想想就頭疼,
還是直接采用賦值的方式了
繼承的作用是什么?繼承的作用的之一,就是服務于多型。
那么你此處使用繼承意義是什么???
直接定義的一個結構體不香嗎?
這里提問只是簡化了場景,實際專案中肯定是用在多型上的
uj5u.com熱心網友回復:
為什么不寫建構式?帶參建構式就好了啊。
再說了,不一定要定義拷貝賦值運算子,它會在你沒定義的自動合成一個
uj5u.com熱心網友回復:
沒有那么多為什么啦,僅是規定而已~~~// 第一種方式
using Sub = struct _Sub {
std::string id;
std::string name;
};
Sub instance{"a", "b"}; //正常
Sub 顯然是聚合類,所以進行聚合初始化。
===========================
// 第二種方式
using Sub1 = struct _Sub1 : public _Base {
std::string name; };
Sub1 instance{"a", "b"}; //報錯,沒有合適的建構式
Sub1 不是聚合類,所以得呼叫建構式。
如樓主所愿,在C++17中,聚合類的標準有所調整,Sub1現在是聚合類了,所以Sub1 instance{"a", "b"}; 這樣寫不會報錯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/74487.html
標籤:C++ 語言
上一篇:學習c/c++ 不找作業的情況下 建議往windows逆向發展 還是正向發展?
下一篇:怎么用程式來安裝字體啊
