天天看點

C++繼承及多重繼承C++繼承 及多重繼承 虛基類

C++繼承 及多重繼承 虛基類

C++繼承

  1. C++類的元素預設都是私有的
  2. C++不繼承構造和析構函數

基礎文法

class class_name: InheritanceMode base_class_name
{
                //member declaration
}   
           
  • C++通路權限
    • public
    • 類外元素都能通路public元素
    • private
    • 子類不能通路父類private元素
    • 但是還是繼承private元素
    • protected
    • 子類可以通路父類protected元素
  • InheritanceMode(繼承方式)
    • public(一般)
    • 父類中的元素繼承到子類後,子類繼承到的元素的通路權限與父類相同
    • private
    • 無論父類中的元素是什麼樣的通路權限,子類繼承到的元素統統變成private
    • protected
    • 父類元素通路權限如果為public或protected,子類繼承到的元素的通路權限為protected
    • 父類元素通路權限如果為private,子類繼承到的元素的通路權限為private

建立派生類對象

  1. 先由基類的構造函數建立派生類包含的基類對象,并初始化
  2. 在由成員對象的構造函數建立成員對象,并初始化
  3. 最後執行本類的構造函數建立本對象,并初始化

代碼

// polymorphism.cpp: 定義控制台應用程式的入口點。
//

#include "stdafx.h"
#include <iostream>
using namespace std;
class Point {
protected :
    int x;
    int y;
public :
    Point  (int x = ,int y = )
    {

    }

};
class SpacePoint : public Point {
protected :
    int z;
public :
    SpacePoint (int px,int py ,int pz = ): Point (px,py)
    {
        z = pz;
    }
    void showPoint(){
        cout << x << endl;
    }
};

int main()
{
    return ;
}

           

多重繼承

  • 優點
    • 能繼承更多
  • 缺點
    • 由于c++繼承會把除了構造函數和析構函數都繼承下來, 若父類們有相同聲明的函數, 則可能導緻調用該函數時的二義性
class class_name: InheritanceMode base_class_name1,InheritanceMode base_class_name2 
{
                //member declaration
}   
           

Virtual Base Classes虛基類

  • 特點
    Multiple derived class share one copy of base class
    • 多個派生類共享一份基類
    • 建立對象時, 基類的對象隻會建立一次
  • 文法
    • virtual 關鍵字要在所有的子類繼承中都聲明
      • 未添加virtual 的子類會自己再建立 一個基類(就是虛基類那個類)
  • Virtual Inheritance (虛繼承) 對象建立順序
    1. 建立虛基類對象
    2. 建立基類對象
    3. 建立對象成員
    4. 建立對象本身
  • 舉例說明
#include <iostream.h>
class A
{
public:
  A(){cout<<"A's con."<<endl;}
~A(){cout<<"A's des."<<endl;}
};
class B
{
public:
    B(){cout<<"B's con."<<endl;}
   ~B(){cout<<"B's des."<<endl;}
};
---------------------------------------------------
           

繼續閱讀