1. 程式人生 > >深入淺出C++之private/public/protected

深入淺出C++之private/public/protected

已知3個類O、P和Q,類O中定義了一個私有方法F1、一個公有方法F2和一個受保護的方法F3:類P和類Q是類O的派生類,其繼承方式如下所示:
class P : protected O {…};
class Q : public O {…};
關於方法F1的描述中正確的是___(34)___;關於方法F2韻描述中正確的是___(35)___;關於方法F3的描述中正確的是___(36)___。
(34)
A.方法F1無法被訪問
B.只有在類O內才能訪問方法F1
C.只有在類P內才能訪問方法F1
D.只有在類Q內才能訪問方法F1
(35)
A.類O、P和Q的物件都可以訪問方法F2
B.類P和Q的物件都可以訪問方法F2
C.類0和Q的物件都可以訪問方法F2
 D.只有在類P內才能訪問方法F2
(36)A.類0、P和Q的物件都可以訪問方法F3
B.類0、P和Q的物件都不可以訪問方法F3
C.類0和Q的物件都可以訪問方法F3
D.類P和Q的物件都可以訪問方法F3。

有甚麼辦法可以簡單地記住這許多的規則? 下文告訴你一個根本不需要記的辦法。

顧名思義,private/public/protected 分別表示 私有/公開/保護,它們是一組用於訪問許可權控制的關鍵字。那麼首先,需要澄清的一個關鍵點是,是要控制誰訪問誰的許可權?這個訪問的主語(施事)是誰?賓語(受事)是誰?

我們經常聽到這樣的說法:

1)一個類友元可以訪問該類的任何成員(包括成員變數及成員方法,下同)。
2)private成員只有該類自身可以訪問,protected成員只有該類及其派生類可以訪問,public成員所有的人都可以訪問。

賓語(受事)是誰這一點很明確,是類的成員(包括成員變數及成員方法)。主語(施事)是誰?這是讓大家發生混淆的關鍵點。也是這個說法中含糊不清的地方。

想清楚一點,其實主語(施事)指的是一個函式,而不是(當然更不是變數)。private/public/protected要控制的是一個函式(施事)對一個類的成員(包括成員變數及成員方法)的訪問許可權。因此比較完整的說法是:

1)一個類友元(包含友元函式或者友元類的所有成員函式)可以訪問該類的任何成員(包括成員變數及成員方法)。

2)除去友元外,private成員只有該類自身的成員函式可以訪問,protected成員只有該類的成員函式及其派生類的成員函式可以訪問,public成員則所有的函式都可以訪問。

也就是說,當我們說一個類可以訪問XXX,其實暗指這個類的成員函式可以訪問XXX。瞭解了這一點,外加一條顯而易見的規則,上面的問題就不難回答了。這條規則是:

3)派生類在繼承時可削弱成員的訪問許可權(通過protected/private修飾)。例如上面的例子class P : protected O {…}; 那麼某個函式通過類P訪問O中成員時,該函式對類O中的public成員只有protected許可權。

補充:有一種技術叫Member Spy(類成員間諜),通過該技術派生類可將基類的protected成員修改為public許可權。這種技術用到了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

已知3個類O、P和Q,類O中定義了一個私有方法F1、一個公有方法F2和一個受保護的方法F3:類P和類Q是類O的派生類,其繼承方式如下所示: class P : protected O {…}; class Q : public O {…};關於方法F1的描述中正確的是___

php面向物件privateprotectedpublic三者許可權控制區別

private protected public 本類內 Y Y Y 子類內 N

php 靜態繫結中的static::與修飾符private,public,protected之間的關係

對於靜態繫結中的static::在此不多做解釋,我想用例項來證明,這個例子是來自官方文件: For example one: class A{ private function

C/C++】C++private虛擬函式

一般我們說虛擬函式,它的訪問級別都是public的,用類物件可以直接呼叫,這樣就可以實現執行時的型別繫結,那如果我們將虛擬函式私有化會出現什麼情況呢? 我們先來看一個非虛擬函式私有化的例子 class Base { private: void Prin

private public protected slots的區別

public slots:在這個區內宣告的槽意味著任何物件都可將訊號與之相連線。這對於元件程式設計非常有用,你可以建立彼此互不瞭解的物件,將它們的訊號與槽進行連線以便資訊能夠正確的傳遞。 prote

C# SharpSsh Private-public a pair key to Upload and Download File

先說說背景 公司要我做一個小的Console應用程式,完成每天的檔案上傳。要上傳的伺服器是第三方Linux系統,用的是SSH,公鑰祕鑰配對的方式。 問題步驟 1.生成公鑰私鑰,將公鑰發給要上傳到的第三方伺服器 2.用Tamir.SharpSsh 完成上傳(StackOve

區域性變數前不能加任何許可權修飾符(private ,public protected)

先看一段程式碼,在一個方法中定義一個int 變數 public void delete(){private int a = 4;} 如果在eclipse工具開發中,編譯時期會提醒我們有錯,錯誤提

C++private虛函數

cout c++ 訪問 return 對象 class 想法 調用 code 一般我們說虛函數,它的訪問級別都是public的,用類對象可以直接調用,這樣就可以實現運行時的類型綁定,那如果我們將虛函數私有化會出現什麽情況呢?是不是很蛋疼的想法。#include<i

C++訪問控制(publicprivateprotected以及friend)

public  所有均可訪問private 類自己的成員函式訪問,不能被類物件訪問protected 類自己以及子類訪問,不能被類物件訪問friend 友元,別人是你的朋友,他可以訪問我的東西。(但不是我可以訪問他的東西)友元關係不能被繼承。友元關係是單向的,不具有交換性。若

c++類中public,private,protected的用法與區別

1、public修飾的成員變數 在程式的任何地方都可以被訪問,就是公共變數的意思,不需要通過成員函式就可以由類的例項直接訪問 2、private修飾的成員變數 只有類內可直接訪問,私有的,類的例項要通過成員函式才可以訪問,這個可以起到資訊隱藏 3、protected是受保護變數 類內

C# 成員預設訪問許可權(publicprivateprotected、internal)

1.C#五個修飾符的許可權修飾符    級別    適用成員        解釋public    公開    類及類成員的修飾符   對訪問成員沒有級別限制private     私有    類成員的修飾符     只能在類的內部訪問protected   受保護的    類成

C++的public繼承中的publicprivateprotected

    C++語言是對C語言的一種增強,而其主要貢獻在於,為C語言增加了類和模板等功能,可以幫助實現面對物件程式設計和程式碼複用等更方便的功能。     在C++語言的類,一般都包含兩種成員,分別是成員變數和成員函式。成員變數可以用來表示該類的某些狀態,而成員函式則可以用來

C# Class, Object (static, public, protected, private)介紹

在這裡,會介紹C#的Class 及 Object基本用法 Class基本架構 物件導向開發時,會運用class來作為資料型別 這時,class就好像一個大類別,

C#中五種訪問修飾符作用範圍 publicprivateprotected、internal、protected internal

在C#語言中,共有五種訪問修飾符:public、private、protected、internal、protected internal。作用範圍如下表:訪問修飾符 說明public 公有訪問。不受任何限制。private 私有訪問。只限於本類成員訪問,子類,例項都不能訪

c/c++ 繼承與多型 繼承中的public, protected, private

問題:類B私有繼承類A,類A有個protected成員,那麼在類B的成員函式裡是否可以使用類A的protected成員? 可以使用。 估計有的同學說不對吧,類B都私有繼承了類A了,怎麼還能訪問類A的protect成員呢?請看下面的例子。在類Pri_derv的f()成員函式裡是可以方位父類Base的pub_

C#中。簡述 privateprotectedpublic、 internal 修飾符的訪問許可權

private : 私有成員, 在類的內部才可以訪問。 protected : 保護成員,該類內部和繼承類中可以訪問。 public :  公共成員,完全公開,沒有訪問限制。 internal: 當前程式集內可以訪問。 程式集是 .NET Framework 應用程

c#基礎(三)PublicPrivate以及Protected的區別

    被public修飾的成員可以被類的內部或者是外部直接訪問,而private成員只能被類的內部訪問,如果類內部的成員不希望被外界訪問,那麼可以將其宣告為private,這樣的話就可以對不希望被訪問的成員進行保護。正常情況下,在某一個類中,欄位(field)或者是成員變數

C++類中publicprivateprotected的作用詳解

首先摘抄一下譚浩強的《C++程式設計》中關於public,private和protected這三個成員訪問限定符的概念性解釋:如果在類的定義中既不指定private,也不指定public,則系統就預設為是私有的。被宣告為私有的(private)成員,只能被本類中的成員函式引用

JavaScript實現類的privateprotectedpublic、static以及繼承

iter web 支持 原理 pan 現象 static 遊戲 inter 基礎知識 JavaScript中的類 JavaScript實際上是一種弱類型語言,與C++和Java等語言不同。因此,在JavaScript中。沒有強調類(class)這

Java: privateprotectedpublic和default的區別

-c .com path class data- pub 其他 註意 font public: 具有最大的訪問權限,可以訪問任何一個在classpath下的類、接口、異常等。它往往用於對外的情況,也就是對象或類對外的一種接口的形式。 protected: 主要的作用就是用來