1. 程式人生 > >C/C++基礎--面向物件程式設計OOP

C/C++基礎--面向物件程式設計OOP

基類通常定義一個虛解構函式,通過基類指標析構派生類物件時不會出現未定義的行為。
如果一個類定義解構函式,編譯器不會為這個類合成移動操作。
虛擬函式覆蓋,可以顯式地加override,可以讓程式設計師的意圖更加清晰,同時讓編譯器可以為我們返現一些錯誤。

派生類,先初始化基類的部分,然後再按照宣告的順序依次初始化派生類的成員。
不希望一個類被繼承,將它定義為final

和內建指標一樣,智慧指標也支援派生類到基類的型別轉換。該轉換隻對指標和引用有效。
同時受可訪問性的限制,如D繼承自B,如不是公有繼承,使用者程式碼不能使用該轉換。D的成員和友元則永遠可以執行轉換。如是公有或保護繼承,D的派生類的成員和友元也可以執行轉換。

虛擬函式的形參和返回型別必須和基類一致。一個例外是,當虛擬函式返回型別是類本身的指標或引用時。

使用作用於運算子可以迴避虛擬函式機制,主要用於派生類中呼叫它覆蓋的基類的虛擬函式版本時。

派生類的成員或友元只能通過派生類物件來訪問基類的受保護成員。而不能直接通過基類物件訪問。

派生訪問說明符對派生類的成員(友元)能否訪問其直接基類的成員沒有什麼影響。主要目的是控制派生類使用者(包括派生類的派生類)對於基類成員的訪問許可權。

通過using宣告語句改變成員的可訪問性,使得派生類的使用者可以使用基類的私有成員。
class Derived:private Base
{
public:
using Base::size;
}

派生類的作用域在基類之內,解析的時候從內往外查詢。一旦找到進行常規的型別檢查,確認是否合法。如果合法,根據是否是虛擬函式將產生不同的程式碼。

派生類刪除的拷貝控制與基類的關係
基類某函式是刪除或不可訪問,派生類對應成員也刪除。
基類解構函式刪除,則派生類合成的預設和拷貝構造是刪除的。
基類移動是刪除的,派生類移動也刪除;基類析構刪除,派生移動構造也刪除。

派生類構造和賦值需要同時處理基類的成員,析構則只負責自己的資源。
D &D::operator=(const D &rhs)
{
Base::operator=(rhs);
//派生類的成員賦值
return *this;
}

派生類繼承基類的建構函式
其實就是using宣告語句顯式地讓編譯器生成與構造基類形參列表完全相同的派生類建構函式。
using B:: B;
生成形式如下
D(parms):base(args){}
不能指定explicit或constexpr,基類是什麼屬性派生類也一樣。預設引數不繼承,生成多個建構函式。
派生類可以繼承部分建構函式,自己定義部分。自己定義的部分將會替換繼承來的相同型別的部分。
預設、拷貝和移動建構函式不會被繼承。