天天看點

面向對象三大特性之繼承(上)

繼承的概念與定義

繼承概念:繼承機制是面向對象設計使代碼可以複用的最重要的手段,它允許程式員在保持原有類特性的基礎上進行擴充,增加功能,這樣産生的新類,稱為派生類。

#include <iostream>
using namespace std;

//基類
class Base
{
public:
	void SetBase(int b)
	{
		_b = b;
	}

	void PrintfBase()
	{
		cout << _b << endl;
	}
public:
	int _b;
};

//派生類
class Derived:public Base
{
public:
	int _d;
};


int main()
{
	//派生類繼承了基類中的成員變量
	cout << sizeof(Derived) << endl;

	//派生類繼承了基類中的成員函數
	Derived d;
	d.SetBase(10);
	d.PrintfBase();

	system("pause");
	return 0;
}
           

繼承定義:

面向對象三大特性之繼承(上)

繼承方式:public、protected、private

三種繼承方式之間的差別:基類中不同權限的成員在子類中的權限。

  • public
    基類中被public和protected修飾的成員,在子類中的權限不變。
    基類中被private修飾的成員在子類中不能直接被通路||不可見,但已被繼承。
               
  • protected
    基類中被public修飾的成員在子類中的權限降為protected。
    基類中被protected修飾的成員在子類中的權限不變。
    基類中被private修飾的成員在子類中不能直接被通路||不可見,但已被繼承。
               
  • private
    基類中被public和protected修飾的成員,在子類中的權限降為private。
    基類中被private修飾的成員在子類中不能直接被通路||不可見,但已被繼承。
               

基類和派生類對象指派轉換

  • 可以将子類對象直接指派給基類對象。
  • 可以讓基類的指針或者引用直接指向子類的對象。

繼承中的作用域

  • 在繼承體系中基類和派生類都有獨立的作用域。
  • 子類和父類中有同名成員,子類成員将屏蔽父類對同名成員的直接通路,這種情況較隐藏,也叫重定義。(在子類成員函數中,可以使用 基類::基類成員 顯示通路)
  • 需要注意的是如果是成員函數的隐藏,隻需要函數名相同就構成隐藏。

派生類的預設成員函數

  1. 如果基類沒有定義構造函數或者基類具有預設的構造函數(無參的和全預設的構造函數)
    -派生類可以不用定義
    -如果派生類需要做其他事情,将自己的構造函數顯示給出就行     
               
    如果基類具有無參的構造函數時,派生類必須顯示定義自己的構造函數,并且必須在其初始化清單的位置顯式調用基類的構造函數,完成派生類對象中基類部分成員的初始化。
  2. 如果基類沒有顯示定義自己的拷貝構造函數,派生類是否定義都可以

    如果基類顯示定義自己的拷貝構造函數,派生類必須顯示定義拷貝構造函數,并且需要在其拷貝構造初始化清單的位置顯示調用基類的拷貝構造函數。

  3. 沒有涉及到管理時:如果派生類沒有顯示定義自己的指派運算符重載,編譯器會生成一份預設的。該預設的指派運算符重載可以完整的指派。

    如果類中涉及到資源管理:派生類需要将自己的拷貝構造函數顯示給出,必須在其内部顯示調用基類的指派運算符重載完成基類部分的指派,再完成自己特有的成員指派。

  4. 派生類對象:基類部分+派生類部分

    派生類的析構函數會在被調用完後自動調用基類的析構函數清理基類成員。因為這樣才能保證派生類對象先清理派生類成員再清理基類成員的順序。

  5. 派生類對象初始化先調用基類的構造再調用派生類構造
  6. 派生類對象析構清理先調用派生類析構再調用基類析構

繼續閱讀