簡體   English   中英

基數 class 和該基數 class 的派生 class 能否有一個共同的朋友 class,它是兩個類的朋友?

[英]Can a base class and a derived class of that base class have a common friend class which is a friend of both the classes?

我知道朋友 class 可以訪問 class 的私有元素,所以我想知道派生 class 可以使用朋友 class 訪問基 class 的私有成員,如果朋友 class 是派生class?

我是一個完全的編程初學者,我剛剛開始學習 C++ 中的 OOP; 當我了解到友元函數/類時,我只是想問這個問題。

在 C++ 中,為了向 class 的私有或受保護成員授予訪問權限,我們應該定義一個朋友 class 或 function(或另一個類的方法)。

友情不是世代相傳的。

因此,為了從另一個 class 訪問基 class 和派生 class 的私有或受保護成員,您應該將“另一個”class 定義為基 class 及其派生 class 的友元。

對於“....如果朋友 class 是基數 class 和派生的 class 的朋友,派生的 class 可以使用朋友 class 訪問基數 class 的私有成員嗎?....”問題。

友誼不是相互的。 如果 class Y 是 Y 的朋友,那么 Y 不會自動成為 X 的朋友。 因此派生 class 無法使用基 class 的朋友訪問基 class 的私有成員。

可以通過使用朋友 class F 從派生的 class D 訪問基 class B 的私有成員。

  1. B應該把F定義為朋友。 (F 可以訪問 B 的私有和受保護成員)
  2. F 應該將 D 定義為朋友。(D 可以訪問 F 的私有和受保護成員)
  3. F 應該定義訪問和/修改 B 的所有私有成員的方法。
  4. F 應該在類型 B 中定義一個屬性,並將此屬性設置為構造函數或方法中的參數。
  5. D 應該在類型 F 中定義一個屬性,並使用 4 中定義的方法或構造函數將自己設置為該屬性。

最后,D 可以通過類型 F 中的屬性訪問 B 的所有私有成員。

可以在同一個文件中定義相同的class,這樣兩者就可以訪問朋友function。Transaction的前向聲明允許Customer class引用Transaction Transaction而不會導致編譯錯誤。 如果您想了解更多關於這方面的信息,請考慮閱讀一本書,因為 inte.net 對學習來說並不是很好,有時也相當有毒。

#include<iostream>
using namespace std;
class Transaction;
class Customer
{
   friend void applyTransaction(Customer, Transaction);
private:
   int custNum;
   double balanceDue;
public:
   Customer(int = 0, double = 0.0);
};
Customer::Customer(int num, double balance)
{
   custNum = num;
   balanceDue = balance;
}
class Transaction
{
   friend void applyTransaction(Customer, Transaction);
private:
   int transactionNum;
   int custNum;
   double amount;
public:
   Transaction(int = 0, int = 0, double = 0.0);
};
Transaction::Transaction(int trans, int cust, double amt)
{
   transactionNum = trans;
   custNum = cust;
   amount = amt;
}
void applyTransaction(Customer cust, Transaction trans)
{
   cout << "Customer #" << cust.custNum <<
   " original balance of $" <<
   cust.balanceDue << endl;
   cust.balanceDue += trans.amount;
   cout << "After transaction #" <<
   trans.transactionNum << " for " <<
   trans.amount << " the new balance is $" <<
   cust.balanceDue << endl;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM