搜尋
首頁常見問題派生類別預設的繼承方式是什麼

派生類別預設的繼承方式是什麼

Aug 21, 2019 pm 01:51 PM
衍生類別繼承

派生類別預設的繼承方式是什麼

  先回答大家的問題:衍生類別的預設繼承方式有兩種。用class定義派生類,預設的繼承方式是private,用struct定義派生類,預設的繼承方式為public。

推薦教學:C 影片教學

#  繼承性是物件導向程式設計的第二大特性,它允許在既有類別的基礎上建立新類,新類別可以繼承既有類別的資料成員和成員函數,可以新增自己特有的資料成員和成員函數,也可以對既有類別中的成員函數重新定義。利用類別的繼承和衍生實現了更高層次的程式碼可重用性,符合現代軟體開發的想法。

      C 語言同時支援單一繼承和多重繼承。單一繼承是指派生類別只從一個基底類別繼承而來;對應的,多重繼承指派生類別同時從兩個或更多的基底類別繼承而來。 java只支援單一繼承。

一. 衍生類別

      衍生類別的定義格式如下:

      class <派生类名>:[继承方式]<基类名1>
            [,[继承方式]<基类名2>,...,[继承方式]<基类名n>]
      {
              <派生类新增的数据成员和成员函数定义>
      };

      說明:

      (1)定義派生類別關鍵字可以是class或是struct,兩者區別是:用class定義派生類,預設的繼承方式是private,用struct定義派生類,預設的繼承方式為public。新增加的成員預設屬性也是class對應private屬性,struct對應public屬性。

      (2)基底類別不能被衍生類別繼承的兩類函數是建構子和析構函數。

二. 3種繼承方式下基底類別成員在衍生類別中的存取屬性

##子public成員子protected成員         -protected子protected成員#子protected成員##子protected成員
繼承描述子 父public成員 父protected成員 父private成員
public
##        -##   
private 子private成員 子private成員         -

# 用下面的程式碼簡單理解一下:

#include "stdafx.h"
#include<iostream>
 using namespace std; 
 class Base
 {
 private:
     int priData;
 9 protected:
    int proData;
 public:
    int pubData;
 };

class D1:private Base//私有继承
 {
    void f1()
     {
        //priData=1;//基类private成员在派生类中不可直接访问
        proData=2;//基类的protected成员在派生类中为private访问属性
         pubData=3;//基类的public成员在派生类中为private访问属性
    }
 };
 class D2:protected Base//保护继承
 {
     void f2()
    {
         //priData=1;//基类private成员在派生类中不可直接访问
        proData=2;//基类的protected成员在派生类中为protected访问属性
         pubData=3;//基类的public成员在派生类中为protected访问属性
     }
 };
 
 class D3:public Base//公有继承
 {
    void f3()
     {
        //priData=1;//基类private成员在派生类中不可直接访问
         proData=2;//基类的protected成员在派生类中为protected访问属性
        pubData=3;//基类的public成员在派生类中为public访问属性
     }
 };
 
 int main()
 {
     Base obj;
    //obj.priData=1;//对象不可访问Base类中private成员
     //obj.proData=2;//对象不可访问Base类中protected成员
    obj.pubData=3;
   D1 objD1;
    //objD1.pubData=3;//private属性,不可访问
    D2 objD2;
     //objD2.pubData=3;//protected属性,不可访问
    D3 objD3;
     objD3.pubData=3;//public属性,可以访问
    return 0;
}

基底類別的private成員函數雖然在衍生類別的成員函數中不可直接訪問,但衍生類別的成員函數可以透過呼叫基底類別被繼承的函數來間接存取這些成員。如果基底類別的函數被繼承後在衍生類別中仍為public成員,則可以透過衍生類別物件直接呼叫。

      先來看看類別成員的存取屬性與功能:

訪問屬性 作用
private 只允許該類別的成員函數及友元函數訪問,不能被其他函數訪問
protected 既允許該類別的成員函數及友元函數訪問,也允許其派生類別的成員函數訪問
#public 既允許該類別的成員函數訪問,也允許類別外部的其他函數存取

 好了,繼續透過程式碼來理解:

#include "stdafx.h"
 #include<iostream>
 using namespace std;
 
class Base
 {
 private:
     int priData;
 protected:
    int proData;
 public:
     int pubData;
 //在类的定义中不能对数据成员进行初始化
     void SetData()//为基类中的数据成员赋值
     {
         priData=100;
        proData=200;
         pubData=300;
    }
    void Print()
     {
        cout<<"priData="<<priData<<endl;
       cout<<"proData="<<proData<<endl;
        cout<<"pubData="<<pubData<<endl;
     }
 };

 class Derived:public Base
 {
 public:
     void ChangeData()
     {
         SetData();
         proData=12;//在派生类的成员函数类可以访问基类的非私有成员                   
     }
 };

 int main()
 {
    Base b;
     b.SetData();
     b.Print();
 
     Derived d1;
     d1.ChangeData();
     d1.pubData=13;
    d1.Print();
     
     return 0;
 }

 程式運行結果如下:

派生類別預設的繼承方式是什麼

以上是派生類別預設的繼承方式是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器