1. 程式人生 > >c++中的訪問屬性,和繼承方式,一些問題的總結

c++中的訪問屬性,和繼承方式,一些問題的總結

第一:private, public, protected 訪問標號的訪問範圍。 private:只能由1.該類中的函式、2.其友元函式訪問。 不能被任何其他訪問,該類的物件也不能訪問。
protected:可以被1.該類中的函式、2.子類的函式、以及3.其友元函式訪問。 但不能被該類的物件訪問。
public:可以被1.該類中的函式、2.子類的函式、3.其友元函式訪問,也可以由4.該類的物件訪問。 注:友元函式包括3種:設為友元的普通的非成員函式;設為友元的其他類的成員函式;設為友元類中的所有成員函式。 第二:類的繼承後方法屬性變化。 private 屬性不能夠被繼承。
使用private繼承
父類的protected和public屬性在子類中變為private;
使用protected繼承,父類的protected和public屬性在子類中變為protected;
使用public繼承,父類中的protected和public屬性不發生改變;
如下所示:                                  public:            protected:       private:
public繼承            public              protected        不可用 
protected繼承       protected       protected        不可用 
private繼承            private           private             不可用


protected繼承和private繼承能降低訪問許可權。(也就是說如果採用protected或者private繼承方式,父類中處了private屬性外全部變成繼承方式的屬性)

為了進一步理解三種不同的繼續方式在其成員的可見性方面的區別,下面從三種不同角度進行討論。
  對於公有繼續方式:
  (1) 基類成員對其物件的可見性:
  公有成員可見,其他不可見。這裡保護成員同於私有成員。
  (2) 基類成員對派生類的可見性:
  公有成員和保護成員可見,而私有成員不可見。這裡保護成員同於公有成員。
  (3) 基類成員對派生類物件的可見性:
  公有成員可見,其他成員不可見。
  所以,在公有繼續時,派生類的物件可以訪問基類中的公有成員;派生類的成員函式可以訪問基類中的公有成員和保護成員。這裡,一定要區分清楚派生類的物件和派生類中的成員函式對基類的訪問是不同的。
  對於私有繼續方式:
  (1) 基類成員對其物件的可見性:
  公有成員可見,其他成員不可見。
  (2) 基類成員對派生類的可見性:
  公有成員和保護成員是可見的,而私有成員是不可見的。
  (3) 基類成員對派生類物件的可見性:
  所有成員都是不可見的。
  所以,在私有繼承時,基類的成員只能由直接派生類訪問,而無法再往下繼續。
  對於保護繼續方式:
  這種繼續方式與私有繼續方式的情況相同。兩者的區別僅在於對派生類的成員而言,對基類成員有不同的可見性。
  上述所說的可見性也就是可訪問性。關於可訪問性還有另的一種說法。這種規則中,稱派生類的物件對基類訪問為水平訪問,稱派生類的派生類對基類的訪問為垂直訪問。
  一般規則如下:
  公有繼續時,水平訪問和垂直訪問對基類中的公有成員不受限制;
  私有繼續時,水平訪問和垂直訪問對基類中的公有成員也不能訪問;
  保護繼續時,對於垂直訪問同於公有繼續,對於水平訪問同於私有繼續。
  對於基類中的私有成員,只能被基類中的成員函式和友元函式所訪問,不能被其他的函式訪問。
  基類與派生類的關係
  任何一個類都可以派生出一個新類,派生類也可以再派生出新類,因此,基類和派生類是相對而言的。
  基類與派生類之間的關係可以有如下幾種描述:
  1. 派生類是基類的具體化
  類的層次通常反映了客觀世界中某種真實的模型。在這種情況下,不難看出:基類是對若干個派生類的抽象,而派生類是基類的具體化。基類抽取了它的派生類的公共特徵,而派生類通過增加行為將抽象類變為某種有用的型別。
  2. 派生類是基類定義的延續
  先定義一個抽象基類,該基類中有些操作並未實現。然後定義非抽象的派生類,實現抽象基類中定義的操作。例如,虛擬函式就屬此類情況。這時,派生類是抽象的基類的實現,即可看成是基類定義的延續。這也是派生類的一種常用方法。
  3. 派生類是基類的組合
  在多繼續時,一個派生類有多於一個的基類,這時派生類將是所有基類行為的組合。
  派生類將其本身與基類區別開來的方法是新增資料成員和成員函式。因此,繼續的機制將使得在建立新類時,只需說明新類與已有類的區別,從而大量原有的程式程式碼都可以複用,所以有人稱類是“可複用的軟體構件”。

附加的一些技術資料:

我們知道c++中通過繼承方式的方法來管理相應資料或者方法的屬性,但是如果我們想在子類中已經繼承過來之後,想改變相應基類中的屬性應該怎麼做呢,我們知道c++的設計機制是,任何東西都不是絕對的,一定有相應的方法來實現相應的需求,這裡用到了spy技術,主要時應用using關鍵字

class A
{
protected:
 int m_data;
};

class SpyA : public A
{
public:
 using A::m_data;
};

void TestSpy(A* pA)
{
 SpyA* pSpyA = static_cast<SpyA*>(pA); 
 // 強制轉換A為SpyA,這要求SpyA沒有成員變數且沒有過載A中的虛擬函式。
 // 現在你可以通過pSpyA訪問m_data了。例如:int data = pSpyA->m_data;
}

由於這種技術用到了強制型別轉換,當謹慎使用。



相關推薦

c++訪問屬性繼承方式一些問題的總結

第一:private, public, protected 訪問標號的訪問範圍。 private:只能由1.該類中的函式、2.其友元函式訪問。 不能被任何其他訪問,該類的物件也不能訪問。 prot

C#的靜態方法靜態變數的一些總結

方法: static 修飾符的方法為靜態方法,反之則是非靜態方法 靜態成員屬於類所有,非靜態成員屬於類的例項所有,無論類建立了多少例項,類的靜態成員在記憶體中只佔同一塊區域。(所有該類的例項都共享這個類的靜態成員) C#靜態方法屬於類所有,類例項化前即可使用,靜態方法只能訪

C++類的三種繼承方式public(公有繼承)、protected(保護繼承)、private(私有繼承)之間的差別(附思維導圖)【轉】

(轉自:https://blog.csdn.net/coco56/article/details/80467975) 注:若不指明繼承方式,則預設是私有繼承。 一:對於公有繼承(public)方式: 基類的public和protected成員的訪問屬性在派生類中保持不變,但基類的p

c/c++時間函數隨機函數的總結

type years errno tween rom 循環語句 see cpu linux時間 c/c++中時間函數和隨機函數的總結 *******************C++的隨機函數和時間函數************ 隨機函數 一、C++中不能使用rand

關於繼承不同繼承方式對於派生類成員以及基類的可見性

通過繼承機制,可以利用已有的資料型別來定義新的資料型別。所定義的新的資料型別不僅擁有新定義的成員,而且還同時擁有舊的成員。我們稱已存在的用來派生新類的類為基類,又稱為父類。由已存在的類派生出的新類稱為派生類,又稱為子類。  在C++語言中,一個派生類可以從一個基類派生,也可以從多個基類派生。從一個基類派生的繼

Android NDK(JNI)學習總結一:Java程式碼申明native函式-Java呼叫C函式並在C函式訪問java類方法、屬性

本文不涉及android-ndk開發環境搭。 步驟一:新建一個APP,名稱為HelloJNI,然後定義一個類(將會在native程式碼中呼叫和訪問該類): package com.example.hellojni; public class JNITe

《隨筆四》——C#的 “屬性索引器的 get set 訪問器的訪問修飾符”

屬性和索引器中的 get 和 set 訪問器的訪問修飾符 ●  索引器和屬性自帶 get 和 set 訪問器,  在預設的情況下:  如果一個屬性有public 訪問級別, 那麼它的那個兩個訪問器

cublas執行矩陣乘法運算的函式 首先要注意的是cublas使用的是以列為主的儲存方式c/c++的以行為主的方式是不一樣的。處理方法可參考下面的註釋程式碼

cublas中執行矩陣乘法運算的函式 首先要注意的是cublas使用的是以列為主的儲存方式,和c/c++中的以行為主的方式是不一樣的。處理方法可參考下面的註釋程式碼 cublas中執行矩陣乘法運算的函式 首先要注意的是cublas使用的是以列為主的儲存方式,和c/c+

2013級C++第12周(春)項目——成員的訪問屬性、多重繼承

更新 日期 報告 時間 上下 cin out 讀取 edate 課程首頁在:http://blog.csdn.net/sxhelijian/article/details/11890759,內有完整教學方案及資源鏈接第一部分 程序閱讀 1、閱讀程序。分析類中成員的訪問屬性

shell腳本介紹shell腳本結構執行方式date命令的用法shell腳本的變量簡介

linux 操作系統 centos shell腳本 筆記內容:20.1 shell腳本介紹20.2 shell腳本結構和執行20.3 date命令用法20.4 shell腳本中的變量筆記日期:2017-11-2120.1 shell腳本介紹 Shell Script,Shell腳本與Wind

C#Post請求的兩種方式發送參數鏈Body的

連接 png ets return div 參數 try 發現 create POST請求 有兩種方式 一種是組裝key=value這種參數對的方式 一種是直接把一個字符串發送過去 作為body的方式 我們在postman中可以看到 sfdsafd sdfsdfds

《隨筆四》——C#的 “ 索引器屬性的相同點不同點、索引器與陣列的區別、索引器的過載 ”

目錄 索引器和屬性的相同點和不同點 索引器與陣列的區別 索引器的過載 關於索引器的詳細請看這裡《隨筆三》——C#中的“ 索引器”  https://blog.csdn.net/qq_34536551/article/details/83926260 索引器(

C++過載、覆蓋隱藏的區別以及適用場景

一、過載、覆蓋和隱藏的區別 二、適用場景 1、過載:   適用於不同的資料型別都需要使用到的功能函式。以資料相加的函式為例,可以在同一個檔案內提供以下的過載函式以支援同樣的功能:   int add(int, int);/*2個整數相加*/   int add(int, int, int);/*3個整數相

java內部類的建立四種情況三種方式及內部資料訪問許可權

內部類和外部類的關係,及內部靜態類的資料訪問許可權,宣告方式。 第一種,在外部類內部宣告使用內部類,內部類的型別為static和非 static型別,內部類資料型別為private,protected,public 型別的訪問許可權。外部類為非靜態宣告和許可權如下: p

C++兩種實現堆的方式:make_heappriority_queue

在實現一些演算法的時候,會用到大大頂堆和小頂堆,下面介紹兩種在C++中實現隊的兩種方式。 1 make_heap()方式 make_heap(): 生成堆,他有兩個引數,也可以有三個引數,前兩個引數是指向迭代器的開始元素和指向迭代器的結束元素。第三個引數是可選的,可以用偽函式le

C++的多型派生繼承

當類的繼承方式為私有繼承時,基類中的公有成員和保護成員都以私有成員身份出現在派生類中,而基類的私有成員在派生類中不可訪問。基類的公有成員和保護成員被繼承後作為派生類的私有成員,派生類的其他成員可以直接訪問它們,但是在類外部通過派生類的物件無法訪問。無論是派生類的成員還是通過派生類的物件,都無法訪問從基類繼承

簡單理解css的垂直居中水平居中即vertical-aligntext-align屬性

                            前言:在很多情況下,我們要使用到內容的居中,這裡的居中包括了垂直居中和水平居中,下面來淺談一下              對於水平居中的屬性

【Unity3d】在Unity3d使用C#訪問系統剪貼簿

直接上程式碼 public static class ClipboardHelper { private static PropertyInfo m_systemCopyBufferProperty = null; private static PropertyIn

java的多型繼承---"編譯看左邊執行看右邊"(多型執行)

老畢的"編譯看左邊,執行看右邊"(多型執行) (對面向物件語言中理解多型、繼承很有幫助~~~) 在多型中,成員變數的特點: 無論編譯和執行,都參考左邊(引用型變數所屬的類) 在多型中,靜態成員函式的特點:無論編譯和執行