1樓:匿名使用者
子類構造的時候會自動呼叫基類的建構函式 並且是有順序的呼叫完建構函式的順序 :基類 子類 子子類 ...
不僅建構函式 析構函式也這樣 子類物件析構時自動呼叫基類的析構函式順序與建構函式順序相反 :子類...基類
關於顯示呼叫基類的建構函式,是不可行的。必須用初始化表的形式呼叫基類建構函式,才能正確的把子類繼承下來的父類的成員初始化了。如果在子類建構函式體內顯式呼叫了基類建構函式的話,那麼該建構函式就會對乙個在子類建構函式記憶體空間內的乙個臨時物件進行了初始化,因為沒有取得正確的物件(子類物件)的指標。
所以構造了半天白費。等子類建構函式退出,則統統丟失。所以,基類建構函式在沒拿到正確this指標的情況下,沒有辦法正確賦值。
下面是例子:
#include
#include
using namespace std;
class clsa
clsa( int i ) : m_j(i) {}int geta()
private:
int m_j;
};class cls: public clsa*/int m_i;
};cls::cls( int i,int j ) : m_i(i) ,clsa(j)
int main()
2樓:匿名使用者
#include
using namespace std;
class base
protected:
int a;
};class a:public basevoid disp()
private:
int b;
};void main()
在c++中為什麼基類不預設構造時候派生類要呼叫基類建構函式進行初始化
3樓:匿名使用者
派生類的建構函式必須呼叫基類的建構函式,這是c++的內部規定。這樣派生類的實現可以專注於自己本身,不用考慮基類的事。
而且,在實際使用時,你根本就不知道大部分基類的實現細節,你只要做好自己派生類的事就行了。 比如你用vc,直接建立乙個對話方塊類,你不需要知道對話方塊類是怎麼生成並顯示的,你只要寫你額外需要的一些**就行了。
4樓:匿名使用者
首先,c++本身就規定建立子類物件的時,先呼叫基類的建構函式,然後再呼叫自己類的建構函式。當我們的基類沒有自己定義建構函式時候(就是系統預設的建構函式)時。建立子類物件會先預設呼叫基類的預設建構函式。
但是,當我們的基類自己定義了建構函式,(可能定義了很多個)此時不會再自動生產預設構造。但是它不知道應該呼叫基類中的哪個構造,所以需要手動指定。
例:#include
class one
//沒有引數的建構函式
one(int a,int b):x(a),y(b)};class two:public one//因為基類已經定義2個構造,所以應該指定呼叫哪個void disp()
};void main()
5樓:匿名使用者
如果你在派生類中沒有顯式指明基類的建構函式,派生類會預設呼叫基類的預設建構函式,所以派生類在初始化的時候,如果呼叫的基類建構函式不是預設的,就需要顯式指明呼叫哪個建構函式。
6樓:匿名使用者
你說的好像有點問題,不管基類的建構函式是不是預設,都要呼叫基類的建構函式;只是當基類的建構函式是預設的時候,派生類也可以預設呼叫基類的預設建構函式,不被顯示呼叫。
c++中為什麼基類中只有帶引數的建構函式時,派生類中一定要顯示定義建構函式,並寫出基類的建構函式及引數
7樓:匿名使用者
因為建立派
抄生類物件時要呼叫基類的bai建構函式,當基類du沒有定義構函式時就調
zhi用預設dao無引數的建構函式。當只定義了有參的建構函式時就呼叫有參的建構函式,所以當派生類沒有給基類傳遞引數時就會出現錯誤。解決方法:
可以在基類中過載乙個無參建構函式,或者給有參建構函式的引數設定預設值。
8樓:匿名使用者
當你定義乙個派生類抄的物件時首
襲先呼叫的是基類的
建構函式,如基類的建構函式是帶參的 在派生類建構函式的後面會有基類的建構函式的傳參 否則就會報錯 指的是呼叫基類中你定義的這個建構函式而不是預設的無參建構函式
c++中為什麼基類中只有帶引數的建構函式時,派生類中一定要顯示定義建構函式,並寫出基類的建構函式及引數
9樓:申其童迎
因為建立派生類物件時要呼叫基類的建構函式,當基類沒有定義構函式時就呼叫預設無引數的建構函式。當只定義了有參的建構函式時就呼叫有參的建構函式,所以當派生類沒有給基類傳遞引數時就會出現錯誤。解決方法:
可以在基類中過載乙個無參建構函式,或者給有參建構函式的引數設定預設值。
10樓:邗芷若桐誠
你的說法本來就是不對的。其實c++無論基類和派生類總是有建構函式,當你不顯式的寫建構函式時系統自動提供預設建構函式。
你問的問題意思是:
如果基類的建構函式帶引數,那麼派生類的建構函式必須顯式的寫建構函式,給基類的建構函式的引數賦值!
基類的建構函式不帶引數時派生類的建構函式可以不有程式設計師寫出來,有系統預設提供。
c++中,為什麼派生類的建構函式如果沒有提供基類的初始化器,
11樓:a774888179巨蟹
c++中成員變數的初始化是在進入建構函式體之前的,如果你需要初始化乙個派生類物件,先會呼叫基類的建構函式,然後為初始化列表中的派生類成員變數進行初始化,如果你的部分或全部的成員變數選擇在函式體內賦值,那麼編譯器會先為這些成員變數進行預設的初始化(呼叫其預設建構函式)然後使用copy assignment操作符為成員變數賦值。所以盡量使用初始化列表效率會更高。當然對於你的第二個問題,原因是派生類不能呼叫基類的private成員,所以如果你相對基類的私有成員初始化的話,就只能在初始化列表中呼叫其建構函式。
12樓:輝じov☆恆
這和你宣告的物件有關 如果你宣告的物件是派生類物件,你宣告的物件將直接到派生類中找建構函式,而不是到其他類中找,它也不會自己到其他類中找,除非你在派生類中呼叫了基類的建構函式.一般要是派生類中沒給出對基類建構函式的呼叫,它就會生成對無引數基類建構函式的自動呼叫.如果你明白為什麼要在派生類中呼叫基類的建構函式就可以理解了
如果你宣告的物件是基類,它毫無疑問會呼叫和它相符的建構函式不用謝
你的話我不是很明白
我只能說 在建構函式中 對基類的呼叫是要用初始化列表 而對派生類的成員是可以用初始化列表 也可以在函式裡直接初始化
至於我這麼說的原因我也不是很清楚
c中派生類重寫基類虛函式的問題望大蝦指教
非也,子類不能直接呼叫父類的成員函式以及成員變數,如果要呼叫就必須用父類 也就是你這個函式中其實呼叫的是父類的函式,這個與虛函式沒有一點關係,僅僅是子類呼叫父類的方式而已。虛函式的價值體現是 我定義乙個子子類物件 cclientsocket ccs 假設有無參建構函式 然後我定義了乙個其他的函式 e...
C 中,為什麼派生類的建構函式如果沒有提供基類的初始化器
a774888179巨蟹 c 中成員變數的初始化是在進入建構函式體之前的,如果你需要初始化一個派生類物件,先會呼叫基類的建構函式,然後為初始化列表中的派生類成員變數進行初始化,如果你的部分或全部的成員變數選擇在函式體內賦值,那麼編譯器會先為這些成員變數進行預設的初始化 呼叫其預設建構函式 然後使用c...
關於c基類派生類的引用和指標,關於C 基類 派生類的引用和指標
1 首先回答第一個問題 用基類的指標指向派生類的物件,這樣做可以體現c 的重要特性 多型性。多型性其實也就是動態聯編。這樣做的好處是 當基類裡面定義了一個虛成員函式的時候,其派生類裡面定義了同名的函式可以實現覆蓋。你的基類指標指向那個物件,就呼叫那個物件的該方法。我舉個例子你應該就明白了 class...