繼承關係裡的六個預設成員函式
在繼承關係裡,如果子類裡沒有顯示定義這六個成員函式,編譯器會預設合成的函式
實現一個繼承關係裡的預設成員函式
class person
{
public:
person(const char* name)
:_name(name)
{
cout << "person()" << endl;
}
person(const person& p)
:_name(p._name)
{
cout << "person(const person())" << endl;
}
person& operator=(const person& p)
{
cout << "person operator=()" << endl;
if (this != &p)
{
_name = p._name;
}
return *this;
}
~person()
{
cout << "~person" << endl;
}
protected:
string _name;
};
class student :public person
{
public:
//子類的建構函式是合成的,將父類的和自己的合成一個
student(const char* name, int num)//子類的建構函式如果沒有傳參,就要將父類的構造定義為預設的
:person(name)//子類的建構函式只能初始化自己的成員,父類的部分要呼叫父類自己的
,_num(num)
{
cout << "student()" << endl;
}
//子類的拷貝建構函式是合成的,要呼叫父類的拷貝構造
student(const student& s)
:person(s)
, _num(s._num)
{
cout << "student(const student &s)" << endl;
}
student& operator=(const student& s)
{
cout << "student& operator=()" << endl;
if (this != &s)
{
person::operator=(s);//一定要指定作用域,否則會一直遞迴,導致棧溢位
_num = s._num;
}
return *this;
}
////不能這樣定義,這樣會構成隱藏,因為所有的解構函式在編譯過程中,函式名都會被改寫成樣的
//~student()
//{
// ~person();
//}
//子類的解構函式不需要呼叫父類的,自己會清理,子類析構,出了作用域,父類呼叫自己的解構函式
~student()
{
cout << "~studnet" << endl;
}
private:
int _num;
};
1.建構函式:
- 子類的建構函式是合成的,將父類的和自己的合成一個
- 子類的建構函式只能初始化自己的成員,父類的部分要呼叫父類自己的
- 子類的建構函式如果沒有傳參,就要將父類的構造定義為預設的
2.拷貝建構函式:
- 子類的拷貝建構函式是合成的,要呼叫父類的拷貝構造
3.賦值運算子過載:
- 子類的賦值運算子過載函式是合成的,要呼叫父類賦值運算子過載
- 呼叫父類賦值運算子,一定要指定作用域,否則會一直遞迴,導致棧溢位
4.解構函式:
- 解構函式不需要用呼叫父類的,自己會清理;
- 子類析構,出了作用域之後,父類呼叫自己的析構;先構造父類,後構造子類,先析構子類,後析構父類
- 所有解構函式的函式名在編譯過程中,都會被改寫為一樣的,所以父類子類會構成隱藏
- 要是想在子類的解構函式中呼叫父類的解構函式,一定要指明作用域
~student()
{
person::~person();
}
相關文章
- #JAVA#物件導向(繼承中成員方法的關係)Java物件繼承
- ArrayList繼承關係分析繼承
- 18、繼承以及繼承中成員變數和成員方法的重名問題繼承變數
- c++中的繼承關係C++繼承
- Javascript繼承2:建立即繼承—-建構函式繼承JavaScript繼承函式
- JavaScript中的函式繼承JavaScript函式繼承
- 類&成員可見性&繼承繼承
- 繼承關係和魔術方法繼承
- 5. JPA物件繼承關係物件繼承
- 繼承中的建構函式繼承函式
- js建構函式的繼承JS函式繼承
- Flutter 吐血整理元件繼承關係圖Flutter元件繼承
- java繼承關係下執行順序Java繼承
- C++ exception 異常類繼承關係C++Exception繼承
- Java建構函式的繼承問題Java函式繼承
- 深入Spring Boot:ClassLoader的繼承關係和影響Spring Boot繼承
- JAVA類的頂層Type抽象和繼承關係Java抽象繼承
- 建構函式、原型、原型鏈、繼承函式原型繼承
- Flutter深入淺出元件篇---繼承關係圖Flutter元件繼承
- 建構函式的prototype與各種繼承函式繼承
- oop類的繼承與類靜態成員學習OOP繼承
- JavaScript中的六種繼承JavaScript繼承
- Java面試題:Java中的集合及其繼承關係Java面試題繼承
- 深刻理解php“繼承“、“私有屬性“、“$this指向“的關係PHP繼承
- Java類是如何預設繼承Object的?Java繼承Object
- 家裡沒有王位繼承?沒關係,有人用AI打造了一個童話魔法世界繼承AI
- 引入const成員函式函式
- C++:類的成員函式C++函式
- JavaScript 中的六種繼承方式JavaScript繼承
- [JavaScript]原型、原型鏈、建構函式與繼承JavaScript原型函式繼承
- c++ const 成員函式C++函式
- C++ 類成員函式C++函式
- C++標準庫中檔案流類的繼承關係C++繼承
- 類內的靜態成員函式函式
- 膨脹的template class成員函式函式
- C++單繼承、多繼承情況下的虛擬函式表分析C++繼承函式
- Java繼承中成員變數的訪問特點「圖文分析」包含繼承中重名訪問的特點Java繼承變數
- JS 繼承的 六 種實現方式JS繼承